目錄
一、集合框架的頂層設計:接口與層次
1. 兩大核心接口:Collection?和?Map
2. Collection接口的三大派系
二、核心實現類詳解
1. List家族實現
2. Set家族實現
3. Queue/Deque家族實現
PriorityQueue:
ArrayDeque:
三、如何選擇正確的集合?
總結原則:
Java集合框架(Java Collections Framework, JCF)是一個用于表示和操作集合的統一架構。它封裝了各種經典的數據結構,提供了了一系列接口、實現和算法,極大地提高了開發效率和數據處理的靈活性。
一、集合框架的頂層設計:接口與層次
集合框架的核心圍繞著一組清晰的接口展開,這種“面向接口編程”的設計使得算法和數據結構解耦,非常靈活。
1. 兩大核心接口:Collection
?和?Map
首先必須明確,Java集合分為兩大家族:
-
Collection
:存儲單一元素的集合。它有三個主要的子接口。 -
Map
:存儲鍵值對(Key-Value)的集合。它自成體系。
(由于您問的是Collection,我們主要聚焦于此,但會簡要對比Map以形成完整認知)。
2. Collection接口的三大派系
Collection
?接口下主要有三個子接口,定義了三種不同的集合特性:
-
List
(列表) - 有序、可重復-
核心特征:元素有明確的順序(插入順序),可以通過索引(下標)精確訪問元素,且允許存儲重復元素。
-
好比:一個動態數組。
-
-
Set
(集) - 無序、不可重復-
核心特征:不允許包含重復元素。最多包含一個
null
元素。大多數實現不保證維護元素的順序。 -
好比:數學中的“集合”概念。
-
-
Queue
(隊列) - 先進先出(FIFO) / 優先級隊列-
核心特征:用于在處理之前保存元素的集合。除了基本的收集功能,還提供了額外的插入、提取和檢查操作。
-
子接口:
Deque
(雙端隊列),支持在兩端插入和移除元素。 -
好比:現實中的排隊。
-
為了更直觀地理解這個層次結構,下圖描繪了Collection集合框架的核心接口與實現類之間的關系:
二、核心實現類詳解
光有接口不夠,我們需要看它們的具體實現。上述圖表中列出的實現類,是我們在日常開發中最常打交道的對象。
1. List家族實現
-
ArrayList
:-
底層結構:動態數組。
-
特點:查詢快(隨機訪問),增刪慢。因為基于數組,通過索引查詢的時間復雜度是O(1);但在中間插入或刪除元素需要移動后續所有元素,效率是O(n)。
-
適用場景:讀多寫少,需要頻繁根據索引訪問元素的場景。
-
-
LinkedList
:-
底層結構:雙向鏈表。
-
特點:增刪快,查詢慢。在鏈表頭尾增刪元素效率很高O(1),但在指定位置插入或查詢需要遍歷鏈表,效率是O(n)。
-
額外功能:實現了
Deque
接口,可以被用作棧、隊列或雙端隊列。 -
適用場景:寫多讀少,需要頻繁在頭部和尾部進行插入刪除操作的場景。
-
-
Vector
(已過時):-
與
ArrayList
類似,但它是線程安全的(方法上用synchronized
修飾)。 -
因其性能差,已被
Collections.synchronizedList()
和JUC
包下的并發容器(如CopyOnWriteArrayList
)取代。
-
2. Set家族實現
-
HashSet
:-
底層結構:基于
HashMap
,只使用了Key來存儲元素,Value是一個固定的Object對象。 -
特點:無序,查詢效率非常高(O(1))。它是最常用的Set。
-
原理:通過元素的
hashCode()
和equals()
方法來判斷是否重復。
-
-
LinkedHashSet
:-
HashSet
的子類。 -
特點:在
HashSet
的基礎上,維護了一個雙向鏈表來記錄插入順序。即迭代順序與插入順序一致。 -
適用場景:既需要去重,又需要保證插入順序。
-
-
TreeSet
:-
底層結構:基于
TreeMap
(紅黑樹)。 -
特點:元素有序(不是插入順序,而是根據元素的自然順序或提供的
Comparator
進行排序)。 -
適用場景:需要對元素進行自動排序的場景。
-
3. Queue/Deque家族實現
-
PriorityQueue
:-
特點:優先級隊列。元素根據自然順序或Comparator進行排序,出隊總是按優先級最高(值最小)的順序。
-
底層結構:通常基于二叉堆實現。
-
適用場景:任務調度等需要按優先級處理的場景。
-
-
ArrayDeque
:-
特點:基于動態數組實現的雙端隊列。效率高于
LinkedList
,且沒有容量限制。 -
適用場景:作為棧(替代老舊的
Stack
類)或隊列使用。是實現FIFO隊列和LIFO棧的首選。
-
三、如何選擇正確的集合?
選擇集合的核心在于根據業務場景權衡其底層數據結構的特性。
場景 | 首選接口 | 推薦實現類 | 理由 |
---|---|---|---|
需要根據索引快速訪問 | List | ArrayList | 隨機訪問性能O(1) |
需要頻繁在頭尾增刪元素 | List ,?Queue ,?Deque | LinkedList ?或?ArrayDeque | 鏈表增刪快,ArrayDeque 作隊列更高效 |
只需要存儲不重復元素 | Set | HashSet | 去重且查詢效率最高 |
需要去重且保持插入順序 | Set | LinkedHashSet | HashSet ?+ 維護插入順序 |
需要元素自動排序 | Set | TreeSet | 基于紅黑樹實現排序 |
需要實現隊列/棧 | Queue /Deque | ArrayDeque | 效率高,無容量限制 |
需要優先級處理 | Queue | PriorityQueue | 基于堆實現優先級 |
總結原則:
-
默認選擇:
ArrayList
?(List),?HashSet
?(Set),?ArrayDeque
?(Queue/Stack)。 -
線程安全:上述集合均非線程安全。多線程環境下應使用
Collections.synchronizedXXX()
包裝器或java.util.concurrent
包下的并發集合(如CopyOnWriteArrayList
,?ConcurrentHashMap
)。