《Java 核心技術 卷 I》第 13 章詳細闡述了集合框架。本文將海量圖表知識點提煉為結構化知識體系,輔以核心 API 對比與實戰選型指南。
Collection (介面)
├── List (有序、可重複)
│ ├── ArrayList (動態陣列,查詢快)
│ ├── LinkedList (雙向鏈表,增刪快)
│ └── Vector / Stack (舊版,同步)
├── Set (無序、不可重複)
│ ├── HashSet (HashMap 底層,O(1))
│ ├── LinkedHashSet (維護插入順序)
│ └── TreeSet (紅黑樹,有序,O(log n))
└── Queue (佇列)
├── PriorityQueue (優先級堆)
├── ArrayDeque (雙端佇列,陣列實現)
└── LinkedList (也實現 Deque)
Map (介面,鍵值對)
├── HashMap (雜湊表,JDK8+ 紅黑樹優化)
├── LinkedHashMap (維護插入/存取順序)
├── TreeMap (紅黑樹,鍵有序)
├── WeakHashMap (弱引用鍵,適合快取)
└── IdentityHashMap (== 比較而非 equals)
| 類別 | 底層結構 | 有序性 | 允許Null | 執行緒安全 | 適用場景 |
|---|---|---|---|---|---|
| ArrayList | 動態陣列 | 插入序 | 是 | 否 | 隨機存取、尾部增刪 |
| LinkedList | 雙向鏈表 | 插入序 | 是 | 否 | 頻繁頭尾增刪、佇列/棧 |
| HashSet | HashMap | 無序 | 一個 | 否 | 去重、集合運算 |
| TreeSet | 紅黑樹 | 自然序/比較器 | 否 | 否 | 排序、範圍查詢 |
| HashMap | 陣列+鏈表/紅黑樹 | 無序 | 一個Key/多Value | 否 | 高效鍵值查找 |
| ConcurrentHashMap | CAS+synchronized+Node | 無序 | 否 | 是(分段鎖) | 高併發讀寫 |
newCapacity = oldCapacity + (oldCapacity >> 1)Arrays.copyOf,頻繁擴容影響效能 → **預估大小用 `ensureCapacity`**putVal 流程:雜湊計算 → 索引定位 → 鏈表/樹遍歷 → 覆蓋或新增 → 擴容檢查accessOrder 參數控制:false(預設)插入序,true 存取序(適合 LRU 快取)removeEldestEntry 實現自動淘汰
需要鍵值對?
├── 是 → 需要有序?
│ ├── 插入序 → LinkedHashMap
│ ├── 排序序 → TreeMap
│ ├── 存取序(LRU) → LinkedHashMap(accessOrder=true)
│ └── 高併發 → ConcurrentHashMap
│ └── 一般 → HashMap
└── 否 → 需要去重?
├── 是 → 需要有序?
│ ├── 插入序 → LinkedHashSet
│ ├── 排序序 → TreeSet
│ └── 一般 → HashSet
└── 否 → 需要索引存取?
├── 是 → ArrayList
└── 否 → 頻繁頭尾操作?
├── 是 → LinkedList / ArrayDeque
└── 否 → ArrayList
// 集合 → 陣列
String[] arr = list.toArray(new String[0]); // 推薦:傳入型別陣列
// 陣列 → 集合
List list = Arrays.asList(arr); // 固定長度列表,不可增刪
List mutableList = new ArrayList<>(Arrays.asList(arr)); // 可變列表
// 基本型別陣列無法直接轉集合,需流式處理
int[] nums = {1,2,3};
List list = Arrays.stream(nums).boxed().collect(Collectors.toList());
Collections.sort(list) / list.sort(comparator):TimSort 混合排序Collections.binarySearch(list, key):前提已排序Collections.reverse/shuffle/rotate/fill/copyCollections.synchronizedList/Set/Map:包裝器模式提供同步視圖Collections.unmodifiableList/Set/Map:不可變視圖,防禦性程式設計| 遺留類別 | 現代替代 | 說明 |
|---|---|---|
| Vector | ArrayList / CopyOnWriteArrayList | 同步開銷大 |
| Stack | ArrayDeque | Deque 介面更豐富 |
| Hashtable | ConcurrentHashMap | 分段鎖效能遠優於全鎖 |
| Enumeration | Iterator | 支援 remove()、forEachRemaining() |
IntList (Eclipse Collections) 或流式處理Java 集合框架是「介面 + 實作 + 演算法」的經典結合。深入理解底層資料結構(陣列、鏈表、紅黑樹、雜湊表)、擴容機制、併發實現,才能在實際業務中做出最優選型,寫出高效、穩健的程式碼。