Java 集合框架是 Java 開發者每日高頻使用的工具箱。本文不僅匯總核心知識點,更從「數據結構本質」、「源碼核心邏輯」、「性能特徵與選型決策」三個維度重構知識體系,助你從「會用」進階到「懂原理、能選型、會優化」。

List:有序、可重複(ArrayList、LinkedList、Vector)Set:無序、不可重複(HashSet、LinkedHashSet、TreeSet)Queue:隊列語義(PriorityQueue、ArrayDeque)HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap)List<String> list = new ArrayList<>(); 便於後續替換實現類。ClassCastException。int → Integer),注意性能開銷。| 特性 | 詳解 |
|---|---|
| 底層結構 | transient Object[] elementData,默認初始容量 10,擴容 1.5 倍(grow()) |
| 隨機訪問 | O(1) - 實現 RandomAccess 標記接口 |
| 插入/刪除 | O(n) - 需 System.arraycopy 移動元素,尾部插入攤還 O(1) |
| 線程安全 | 非線程安全,多寫場景用 Collections.synchronizedList 或 CopyOnWriteArrayList |
| 避坑指南 | 預估數據量用 new ArrayList<>(capacity) 避免頻繁擴容;遍歷刪除用 Iterator.remove() 避免 ConcurrentModificationException |
Node<E> 節點類,含 prev/next 指針,維護 first/last 哨兵。Deque、Queue 接口,天然支持棧/隊列操作(push/pop、offer/poll)。ArrayList 通常更快。Vector:所有方法 synchronized,性能差,已被 Collections.synchronizedList / CopyOnWriteArrayList 替代。Stack:繼承 Vector,push/pop/peek 操作棧頂,推薦用 ArrayDeque 替代(雙端隊列,性能更強、API 更豐富)。HashMap<E, Object>,值統一用 PRESENT 佔位對象。equals() 必須重寫 hashCode(),且相等對象哈希碼必須相等。null 元素,非線程安全。HashSet,內部維護雙向鏈表記錄插入序。TreeMap(紅黑樹),元素按自然順序(Comparable)或定製比較器(Comparator)排序。O(log n):first()/last()、subSet()/headSet()/tailSet() 範圍視圖、lower()/higher() 鄰近查找。ClassCastException。Node<K,V>[] table、size、threshold(擴容閾值 = 容量 × 載入因子 0.75)。put 流程:計算 hash → 定位索引 → 遍歷鏈表/樹覆蓋或新增 → 檢查擴容。null key(僅一個,放索引 0)與多個 null value。HashMap,新增 head/tail 維護雙向鏈表。accessOrder=false,put 不移動節點。accessOrder=true,get/put 將節點移至尾部 —— LRU 緩存核心實現。removeEldestEntry 實現定容 LRU:return size() > MAX_ENTRIES;NavigableMap,鍵需實現 Comparable 或構造傳入 Comparator。get 無鎖(volatile Node[] table 保證可見性),put 僅鎖定目標桶首節點。transfer,size() 用 LongAdder 思想統計。null key/value,避免歧義(get(null) 無法區分「不存在」與「值為 null」)。Hashtable:全方法 synchronized,單鎖性能極差,已被 ConcurrentHashMap 完全取代。Properties:繼承 Hashtable,專用於配置文件加載(load/store),鍵值均為 String。Collections:靜態方法庫 —— sort/shuffle/reverse/rotate/fill/copy/binarySearch、synchronizedXxx/uncheckedXxx/singletonXxx/emptyXxx 視圖/包裝、max/min/frequency/disjoint 統計。Arrays:數組操作 —— asList(定長 List)、stream、parallelSort、mismatch/compare。| 場景需求 | 首選實現 | 備選/注意 |
|---|---|---|
| 高頻隨機訪問、尾部增刪 | ArrayList | 預設容量 |
| 高頻頭尾增刪、隊列/棧 | ArrayDeque | 非線程安全,比 LinkedList 快 |
| 去重、無序、高性能 | HashSet | 重寫 hashCode/equals |
| 去重、保持插入序 | LinkedHashSet | |
| 去重、自動排序、範圍查詢 | TreeSet | 實現 Comparable |
| 鍵值映射、高並發讀寫 | ConcurrentHashMap | 禁用 null 鍵值 |
| 鍵值映射、需插入/訪問序 | LinkedHashMap | LRU 緩存設 accessOrder=true |
| 鍵值映射、需鍵有序、範圍查詢 | TreeMap | |
| 單線程、簡單映射 | HashMap | 預設容量避免擴容 |
Java 集合框架的精妙在於:接口定義語義,實現封裝數據結構與演算法。深入理解底層結構(動態數組、鏈表、紅黑樹、哈希表)、核心參數(載入因子、擴容閾值、樹化閾值)與線程安全機制(fail-fast、CAS、分段鎖、細粒度鎖),才能在海量數據、高併發、低延遲的實戰中做出最優選型,寫出經得起生產環境考驗的代碼。