面試時發現自己對集合底層「知其然不知其所以然」,趁機系統梳理。本文覆蓋 Collection 體系架構、主流實現類數據結構、線程安全性、性能特點及選型建議,作為查漏補缺的速查手冊。
java.util.Collection (介面)
├─ List (有序、可重複)
│ ├─ ArrayList (動態數組)
│ ├─ LinkedList (雙向鏈表)
│ ├─ Vector (同步動態數組,舊)
│ └─ Stack (Vector 子類,LIFO)
└─ Set (無序、唯一)
├─ HashSet (HashMap 鍵)
├─ LinkedHashSet (鏈表+哈希,保持插入序)
└─ TreeSet (紅黑樹,有序)
java.util.Map (介面)
├─ HashMap (數組+鏈表/紅黑樹)
├─ LinkedHashMap (保持插入/訪問序)
├─ TreeMap (紅黑樹,Key 有序)
├─ Hashtable (同步,舊)
└─ ConcurrentHashMap (分段鎖/CAS,高並發)
| 實現類 | 底層結構 | 線程安全 | 隨機訪問 | 增刪(頭/尾/中) | 適用場景 |
|---|---|---|---|---|---|
| ArrayList | 動態數組 | ❌ | ✅ O(1) | 尾部 O(1) / 頭部、中間 O(n) | 讀多寫少、頻繁隨機訪問 |
| LinkedList | 雙向鏈表 | ❌ | ❌ O(n) | 頭/尾 O(1) / 中間 O(n) | 頻繁頭尾增刪、實現隊列/棧 |
| Vector | 動態數組 | ✅ (方法級 synchronized) | ✅ | 同 ArrayList | ⚠️ 已棄用,推薦 Collections.synchronizedList 或 CopyOnWriteArrayList |
| Stack | 繼承 Vector | ✅ | - | - | ⚠️ 推薦 Deque (ArrayDeque) |
擴容機制: ArrayList 1.5 倍擴容(JDK 8+),ensureCapacity() 可預分配減少拷貝。
| 實現類 | 底層 | 有序性 | Null 支持 | 性能特點 |
|---|---|---|---|---|
| HashSet | HashMap | 無序 | 允許 1 個 null | 增刪查 O(1),依賴 hashCode/equals |
| LinkedHashSet | HashMap + 雙向鏈表 | 插入序 | 允許 1 個 null | 比 HashSet 稍慢,但可預測遍歷順序 |
| TreeSet | TreeMap (紅黑樹) | 自然序/定製 Comparator | ❌ (拋 NPE) | 增刪查 O(log n),支持範圍查詢 |
removeEldestEntry)subMap、headMap 範圍查詢
// 1. 同步包裝器 (性能一般,迭代器需手動同步)
List syncList = Collections.synchronizedList(new ArrayList<>());
// 2. 併發包專用類 (推薦)
List cowList = new CopyOnWriteArrayList<>(); // 讀多寫少
Map chm = new ConcurrentHashMap<>(); // 高並發 Map
Queue queue = new ConcurrentLinkedQueue<>(); // 無界非阻塞隊列
Deque deque = new LinkedBlockingDeque<>(); // 有界阻塞雙端隊列
ConcurrentHashMapLinkedHashMap (插入序) / TreeMap (Key 排序)HashMapTreeSetLinkedHashSetHashSetArrayListLinkedList / ArrayDequeCopyOnWriteArrayList集合框架是 Java 開發的高頻基建,理解底層數據結構(數組、鏈表、紅黑樹)、線程安全機制(鎖、CAS、COW)才能在性能調優、並發 Bug 排查、面試應對中遊刃有餘。建議收藏對照查閱,並親自閱讀 JDK 源碼(ArrayList.java、HashMap.java、ConcurrentHashMap.java)加深印象。