一、集合框架總體架構

頂層接口:Collection(單列集合)、Map(雙列鍵值對)。
二、核心體系詳解
1. Collection → List(有序、可重複)
| 實現類 | 底層結構 | 特點 | 線程安全 |
ArrayList | 動態數組 | 隨機訪問快,擴容拷貝,末尾增刪 O(1) | 否 |
LinkedList | 雙向鏈表 | 首尾增刪 O(1),隨機訪問 O(n),實現 Deque | 否 |
Vector | 動態數組 | 方法 synchronized,擴容 2倍,性能差 | 是 |
Stack | 繼承 Vector | 後進先出,提供 push/pop/peek | 是 |
2. Collection → Set(無序、唯一)
| 實現類 | 底層結構 | 特點 | 線程安全 |
HashSet | HashMap (哈希表) | 查詢最快 O(1),順序不固定 | 否 |
LinkedHashSet | 鏈表 + 哈希表 | 保持插入順序 | 否 |
TreeSet | 紅黑樹 | 自然序/定制序有序,O(log n) | 否 |
EnumSet | 位向量 | 枚舉專用,極致性能 | 否 |
3. Map(鍵值對、鍵唯一)
| 實現類 | 底層結構 | 特點 | 線程安全 |
HashMap | 數組 + 鏈表/紅黑樹 (JDK8) | 查詢最快,允許 null key/value | 否 |
LinkedHashMap | 雙向鏈表 + 哈希表 | 保持插入/訪問順序 | 否 |
TreeMap | 紅黑樹 | 鍵有序,實現 SortedMap | 否 |
Hashtable | 哈希表 | 不允許 null,方法 synchronized | 是 |
Properties | 繼承 Hashtable | 配置文件專用,key/value 均為 String | 是 |
WeakHashMap | 弱引用鍵 | 鍵無外部引用可被 GC 回收 | 否 |
EnumMap | 數組 | 枚舉鍵專用,性能極高 | 否 |
4. Queue(隊列)
- 阻塞隊列:
ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue、DelayQueue、SynchronousQueue — 生產者消費者首選。
- 非阻塞雙端隊列:
ArrayDeque(推薦替代 Stack)、LinkedBlockingDeque。
PriorityQueue:優先級隊列(堆),非線程安全。
三、核心差異對比(高頻面試點)
ArrayList vs Vector
- 同步性:Vector 同步(慢),ArrayList 非同步(快)。
- 擴容:Vector 2倍,ArrayList 1.5倍。
- 現代替代:
Collections.synchronizedList(new ArrayList()) 或 CopyOnWriteArrayList。
ArrayList vs LinkedList
- 隨機訪問:ArrayList O(1) 完勝。
- 中間增刪:LinkedList 只改指針 O(1)(定位仍 O(n)),ArrayList 需移動數組 O(n)。
- 記憶體:LinkedList 節點對象開銷大。
- 經驗法則:默認 ArrayList,頻繁中間增刪才考慮 LinkedList。
HashMap vs TreeMap
- 順序:HashMap 無序,TreeMap 紅黑樹有序。
- 性能:HashMap O(1) 快於 TreeMap O(log n)。
- 鍵要求:HashMap 需正確重寫
hashCode/equals;TreeMap 鍵需實現 Comparable 或傳 Comparator。
HashMap vs Hashtable
- 歷史:Hashtable 古老 (JDK 1.0),HashMap 現代 (JDK 1.2)。
- 同步:Hashtable 同步,HashMap 非同步。
- null:HashMap 允許一個 null key、多個 null value;Hashtable 全不允許。
四、選型決策樹
- 需鍵值對 →
Map:默認 HashMap,需有序 → TreeMap/LinkedHashMap,高併發 → ConcurrentHashMap。
- 單列集合 →
Collection:
- 需唯一 →
Set:默認 HashSet,需有序 → TreeSet/LinkedHashSet。
- 允許重複 →
List:默認 ArrayList,頻繁首尾操作/作棧/隊列 → ArrayDeque/LinkedList。
- 生產者消費者 →
BlockingQueue 實現類。
五、最佳實踐原則
- 面向接口編程:
List<String> list = new ArrayList<>();
- 指定初始容量:
new ArrayList(1000) 減少擴容。
- 線程安全用並發包:
ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue,拒絕 Vector/Hashtable/Collections.synchronizedXxx。
- 遍歷優先
for-each / stream(),需刪除用 Iterator.remove()。