集合框架是 Java API 中使用頻率最高、設計最精妙的部分之一。它統一了對「對象組」的表示與操作,提供高性能數據結構 (動態數組、鏈表、紅黑樹、哈希表、堆) 與通用算法 (排序、查找、洗牌)。本文系統梳理架構、核心接口契約、主流實現類特性、選型決策樹。
java.lang.Iterable
└── java.util.Collection (根接口)
├── java.util.List (有序, 可重複, 可索引訪問)
│ ├── java.util.ArrayList
│ ├── java.util.LinkedList
│ ├── java.util.Vector (同步, 老舊)
│ └── java.util.Stack (Vector 子類, 不推薦)
├── java.util.Set (無序, 唯一, 無索引)
│ ├── java.util.HashSet (HashMap 鍵, 無序)
│ ├── java.util.LinkedHashSet (鏈表維護插入序)
│ └── java.util.TreeSet (紅黑樹, 自然序/比較器序)
└── java.util.Queue (隊列, FIFO/優先級)
├── java.util.PriorityQueue (堆, 優先級隊列)
├── java.util.ArrayDeque (雙端隊列, 非線程安全, 高性能)
└── java.util.concurrent.BlockingQueue (阻塞隊列接口)
java.util.Map (獨立根接口, 鍵值對)
├── java.util.HashMap (數組+鏈表/紅黑樹, 無序)
├── java.util.LinkedHashMap (雙向鏈表維護插入/訪問序)
├── java.util.TreeMap (紅黑樹, 有序)
├── java.util.Hashtable (同步, 老舊)
└── java.util.Properties (Hashtable 子類, 配置文件)

public interface Collection extends Iterable {
// 基礎操作
int size(); boolean isEmpty();
boolean contains(Object o);
boolean add(E e); // 可選操作
boolean remove(Object o); // 可選操作
Iterator iterator(); // 唯一遍歷方式
// 批量操作
boolean containsAll(Collection> c);
boolean addAll(Collection extends E> c);
boolean removeAll(Collection> c);
boolean retainAll(Collection> c); // 保留交集
void clear();
// 轉數組
Object[] toArray();
T[] toArray(T[] a);
}
public interface Iterator {
boolean hasNext();
E next();
void remove(); // 可選:從底層集合移除最後 next() 返回的元素
}
// ListIterator (List 專用,雙向、可修改、可定位)
public interface ListIterator extends Iterator {
boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex();
void set(E e); void add(E e);
}
foreach 語法糖:`for (E e : coll) {}` 編譯器自動轉換為 `Iterator` 模式。**遍歷時不可修改集合結構** (增/刪),否則拋 `ConcurrentModificationException` (fail-fast)。
| 實現 | 底層結構 | 隨機訪問 | 頭尾增刪 | 中間增刪 | 線程安全 | 適用場景 |
|---|---|---|---|---|---|---|
| ArrayList | 動態數組 | O(1) ✅ | O(1) 擴容均攤 | O(n) 需移動 | ❌ | **默認首選**:頻繁隨機訪問、尾部增刪、作為堆棧 |
| LinkedList | 雙向鏈表 | O(n) ❌ | O(1) ✅ | O(1) 定位後 | ❌ | 頻繁頭部/中間增刪、實現隊列/棧 (Deque) |
| Vector | 動態數組 | O(1) | O(1) | O(n) | ✅ 方法級 synchronized | **棄用**:性能差,用 `Collections.synchronizedList` 或 `CopyOnWriteArrayList` |
| 實現 | 底層 | 有序性 | 性能 (增/刪/查) | Null 元素 | 適用場景 |
|---|---|---|---|---|---|
| HashSet | HashMap | 無序 | O(1) | 允許 1 個 | **默認首選**:去重、集合運算 (交/並/差)、高性能查找 |
| LinkedHashSet | LinkedHashMap | 插入序 | O(1) | 允許 1 個 | 需保持插入順序的去重 (如 LRU 緩存鍵集) |
| TreeSet | TreeMap (紅黑樹) | 自然序/比較器序 | O(log n) | 不允許 | 需有序集合、範圍查詢 (subSet, headSet, tailSet) |
| 實現 | 底層 | 有序性 | 性能 | Null Key/Value | 適用場景 |
|---|---|---|---|---|---|
| HashMap | 數組+鏈表/紅黑樹 (JDK8) | 無序 | O(1) | 允許 1 Key, 多 Value | **默認首選**:緩存、索引、計數、鍵值存儲 |
| LinkedHashMap | HashMap + 雙向鏈表 | 插入序/訪問序 | O(1) | 允許 | LRU 緩存 (accessOrder=true)、保持配置文件順序 |
| TreeMap | 紅黑樹 | Key 自然序/比較器序 | O(log n) | 不允許 Null Key | 有序映射、範圍查詢、一致性哈希環節點 |
| Hashtable | 數組+鏈表 | 無序 | O(1) 同步開銷大 | 不允許 Null | **棄用**:用 `ConcurrentHashMap` (JDK8 CAS+ synchronized) |
| ConcurrentHashMap | 數組+鏈表/紅黑樹 + CAS/synchronized | 無序 | 高併發 O(1) | 不允許 Null | **多線程首選**:高併發緩存、計數器 |
int[] arr = {3, -4, 25, 16, 30, 18};
Arrays.parallelSort(arr); // 多線程並行排序 (大數組顯著加速)
Arrays.parallelPrefix(arr, (x,y)->x*y); // 並行前綴累積 (1, -4, -100, -1600...)
Arrays.parallelSetAll(new int[5], i -> i*5); // 並行生成 [0,5,10,15,20]