本文基於 JDK 8 源碼,系統梳理 Collection 介面下 Set、List、Queue 三大分支的核心實現類別,涵蓋資料結構、原理機制、效能特徵、執行緒安全性與選型建議,附帶類圖與源碼關鍵點註解。

提供 Collection 介面骨幹實現,最小化實現成本:
iterator() 和 size()add() (否則拋 UnsupportedOperationException) 和迭代器的 remove()Collection 參數構造器特徵:元素唯一 (e1.equals(e2) 為 false),最多一個 null。
HashMap<E, Object> (value 統一為 PRESENT 常量)Collections.synchronizedSet(new HashSet<>())ConcurrentModificationException 僅作檢測 bug 用LinkedHashMap (雙向鏈表維護順序)TreeMap 實現 NavigableSetComparable) 或自訂序 (Comparator)Collections.synchronizedSortedSet(new TreeSet<>())subSet, headSet, tailSet)| 類別 | 特徵 | 適用場景 |
|---|---|---|
| CopyOnWriteArraySet | 寫時複製、執行緒安全、迭代器快照、變更開銷大 | 極小集合、讀多寫少、需並發遍歷 |
| ConcurrentSkipListSet | 跳表、可縮放並發、有序、弱一致性迭代器、不允許 null | 高並發有序集合、排序快取 |
特徵:處理前保存元素,雙形式方法 (拋異常/返回特值),通常 FIFO。
Comparator 排序,頭部為最小元素Deque、Stack、Queue 三介面特徵:有序 (插入序)、可重複、索引存取、可視為動態陣列。
Object[] elementData,transient 不序列化size, isEmpty, get, set, iterator 均 O(1)add 均攤 O(1) (擴容 1.5 倍:newCapacity = oldCapacity + (oldCapacity >> 1))ensureCapacity 預分配減少擴容writeObject 僅寫入 size 範圍元素Node<E> (item, next, prev),首尾哨兵節點List、Deque、Queuesynchronized,效能差capacityIncrement (默認 2倍)Collections.synchronizedList 或 CopyOnWriteArrayListVector,五操作:push, pop, peek, empty, searchArrayDeque 替代:Deque<Integer> stack = new ArrayDeque<>();| 類別 | 特徵 | 適用場景 |
|---|---|---|
| CopyOnWriteArrayList | 寫時複製、執行緒安全、迭代器快照、變更開銷大、不支援迭代器 remove | 讀多寫少、需並發遍歷無衝突 (事件監聽器列表) |
| 需求 | 首選 | 備選 | 避免 |
|---|---|---|---|
| 一般列表、隨機存取 | ArrayList | Vector (舊) | LinkedList |
| 頻繁頭尾增刪、佇列/棧 | ArrayDeque | LinkedList | ArrayList |
| 去重、無序 | HashSet | LinkedHashSet | TreeSet |
| 去重、保持插入序 | LinkedHashSet | - | - |
| 去重、自動排序 | TreeSet | ConcurrentSkipListSet | - |
| 高並發列表、讀多寫少 | CopyOnWriteArrayList | Collections.synchronizedList | Vector |
| 高並發佇列 | ConcurrentLinkedQueue | ArrayBlockingQueue | LinkedList |
| 優先級佇列 | PriorityQueue | - | - |
AbstractCollection → 理解骨幹實現ArrayList → 陣列擴容、序列化、subList 視圖HashMap → 哈希表、紅黑樹轉換、擴容遷移 (HashSet 直接委託)LinkedHashMap → 雙向鏈表維護順序 (LinkedHashSet 委託)TreeMap → 紅黑樹旋轉、插入刪除修復 (TreeSet 委託)PriorityQueue → 堆調整、siftUp/siftDownConcurrentHashMap → CAS、synchronized、擴容遷移 (JDK 8+)CopyOnWriteArrayList → 寫時複製、快照迭代器核心心法:集合選型無絕對優劣,只有場景匹配。理解底層資料結構 (陣列、鏈表、哈希表、紅黑樹、堆、跳表) 的時空間特性,結合業務訪問模式 (讀寫比、並發度、排序需求、順序敏感度) 做決策。原始碼是最好的文檔,建議配合 JMH 基準測試驗證假設。
深度掌握集合框架,不僅能寫出高效代碼,更能在排查線上效能問題、記憶體洩漏、並發異常時直指本質。