集合框架概覽
Java 集合框架位於 java.util 包,提供了完善的數據結構實現:List、Set、Queue、Map 等。整體架構分為兩大體系:Collection(單列集合)和 Map(雙列映射)。
Collection 體系詳解
List 接口:有序、可重複
- ArrayList:動態數組,隨機訪問快,增刪慢,非線程安全,主流選擇
- LinkedList:雙向鏈表,頭尾增刪快,隨機訪問慢,實現 Deque,適合隊列/棧
- Vector:同步方法,線程安全,擴容翻倍,性能差,已過時
- Stack:繼承 Vector,後進先出,不推薦使用,改用 Deque
Set 接口:無序、不可重複
- HashSet:基於 HashMap 實現,O(1) 添加/查找,無序,允許 null
- LinkedHashSet:基於 LinkedHashMap,維護插入順序
- TreeSet:基於 TreeMap(紅黑樹),有序,O(log n),元素需實現 Comparable 或提供 Comparator
Queue 接口:隊列操作
- PriorityQueue:優先隊列,基於堆,不保證同優先級順序
- ArrayDeque:雙端隊列,循環數組,性能優於 LinkedList
- LinkedList:也實現 Deque,但性能較差
- Concurrent 包:BlockingQueue 實現(ArrayBlockingQueue, LinkedBlockingQueue 等)
Map 體系詳解
核心實現
- HashMap:哈希表 + 鏈表(JDK 8+ 紅黑樹),O(1),非線程安全,主流選擇
- LinkedHashMap:維護插入/訪問順序,適合 LRU 緩存
- TreeMap:紅黑樹,有序,O(log n)
- Hashtable:同步方法,線程安全,不允許 null,已過時
- ConcurrentHashMap:分段鎖/CAS,高併發首選
- WeakHashMap:弱引用鍵,適合緩存
- IdentityHashMap:用 == 比較鍵,特殊用途
迭代器與工具類
Iterator vs ListIterator
- Iterator:通用單向遍歷,hasNext、next、remove
- ListIterator:List 專用雙向遍歷,支持 add、set、previous、索引獲取
- Enumeration:JDK 1.0 遺留,僅用於 Vector、Hashtable,功能較弱
Arrays 與 Collections 工具類
- Arrays:排序、二分查找、填充、複製、轉 List、並行流操作
- Collections:排序、二分查找、同步包裝、不可修改視圖、空集合、填充、替換、旋轉、打亂等
核心設計模式應用
適配器模式
AbstractCollection、AbstractList、AbstractSet、AbstractMap、AbstractQueue 等抽象類實現了接口的大部分默認方法,子類只需實現核心抽象方法(如 iterator、size、get 等),大幅減少樣板代碼。
裝飾器模式
Collections.synchronizedList、unmodifiableList、checkedList 等靜態工廠方法返回包裝器,動態添加同步、只讀、類型檢查等功能。
迭代器模式
統一遍歷接口,屏蔽底層數據結構差異,支持 fail-fast 機制(modCount 檢測並發修改)。
選型決策指南
List 選型
- 默認 ArrayList
- 頻繁頭尾增刪、作為隊列/棧 → ArrayDeque 或 LinkedList
- 多線程讀多寫少 → CopyOnWriteArrayList
- 多線程寫多 → Collections.synchronizedList 或並發包
Set 選型
- 無序、高性能 → HashSet
- 需保持插入順序 → LinkedHashSet
- 需有序遍歷 → TreeSet
- 多線程 → ConcurrentHashMap.newKeySet() 或 CopyOnWriteArraySet
Map 選型
- 默認 HashMap
- 需有序 → TreeMap
- 需插入/訪問順序 → LinkedHashMap
- 高併發 → ConcurrentHashMap
- 緩存場景 → WeakHashMap 或 Caffeine/Guava Cache
總結
Java 集合框架經過多版本演進,設計精良、功能豐富。掌握核心接口體系、主流實現類特點、底層數據結構、適用場景與設計模式應用,是編寫高效、可維護 Java 代碼的基礎。現代開發中應優先選用非同步集合配合顯式同步策略,避免使用 Vector、Hashtable、Stack 等過時類別。