
綠色為接口,紅色為常用實現類。核心分為 Collection(單列)與 Map(雙列)兩大體系。
| 實現 | 底層結構 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| ArrayList | 動態數組 | 隨機訪問 O(1),遍歷快 | 中間增刪 O(n) 需搬移元素 | 讀多寫少、頻繁隨機訪問 |
| LinkedList | 雙向鏈表 | 首尾/中間增刪 O(1),實現 Queue/Deque | 隨機訪問 O(n),內存佔用大 | 寫多讀少、棧/隊列、頻繁增刪 |
| Vector | 動態數組 | 線程安全(synchronized) | 性能差,已被 Collections.synchronizedList 替代 | 極少用 |
// 初始容量 10,擴容 1.5 倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
static class Node {
E item;
Node next;
Node prev;
}
| 實現 | 底層 | 特點 | 場景 |
|---|---|---|---|
| HashSet | HashMap | 查找 O(1),無序 | 去重、快速判斷存在性 |
| LinkedHashSet | LinkedHashMap | 保持插入順序 | 需有序去重 |
| TreeSet | TreeMap (紅黑樹) | 自然序/定制序有序,O(log n) | 排序去重、範圍查詢 |
Queue/Deque:offer/poll/peek。Comparator 定制。允許重複元素。| 實現 | 底層 | 特點 | 場景 |
|---|---|---|---|
| HashMap | 數組+鏈表/紅黑樹 (JDK8) | 查找/插入 O(1),Key 可 null | 高頻緩存、鍵值存儲 |
| LinkedHashMap | HashMap + 雙向鏈表 | 保持插入/訪問順序 | LRU 緩存、有序遍歷 |
| TreeMap | 紅黑樹 | Key 有序,O(log n) | 範圍查詢、排序映射 |
| Hashtable | 數組+鏈表 | 線程安全,Key/Value 不可 null | 已淘汰,用 ConcurrentHashMap |
| ConcurrentHashMap | CAS + synchronized (JDK8) | 高併發線程安全 | 多線程環境首選 |
foreach 本質是 Iterator,直接在循環中 list.remove() 會拋 ConcurrentModificationException(modCount 不匹配)。
Iterator<String> it = list.iterator();
while (it.hasNext()) {
it.next(); // 必須先 next(),否則 lastRet=-1 拋 IllegalStateException
if (condition) it.remove();
}
Collections.addAll(list, arr):將數組/可變參數批量加入集合。Arrays.asList(arr):返回固定大小的 List(底層仍是數組),不可增刪,但可修改元素值。ConcurrentHashMap,有序 LinkedHashMap/TreeMap,一般 HashMap。LinkedHashSet/TreeSet,一般 HashSet。ArrayList,首尾/中間增刪 LinkedList。PriorityQueue,雙端 ArrayDeque。Java 集合框架設計精妙,掌握底層數據結構(數組、鏈表、紅黑樹、哈希表)與核心源碼(擴容、modCount、樹化閾值),才能在面對海量數據、高併發、內存敏感等場景時做出最優選型。建議收藏決策樹,實戰中「測試驗證 > 經驗猜測」。