首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 集合框架核心知識體系全景圖:從 ArrayList 到 ConcurrentHashMap

     編輯:Java 綜合教學

前言

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

一、總體架構與核心接口設計哲學

1.1 兩大頂級接口體系

集合框架架構圖

  • Collection 接口: 單列數據集合
    • List:有序、可重複(ArrayList、LinkedList、Vector)
    • Set:無序、不可重複(HashSet、LinkedHashSet、TreeSet)
    • Queue:隊列語義(PriorityQueue、ArrayDeque)
  • Map 接口: 雙列鍵值對映射
    • 鍵唯一、值可重複(HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap)

1.2 設計精髓:接口與實現分離

  • 面向接口編程:List<String> list = new ArrayList<>(); 便於後續替換實現類。
  • 泛型擬化:編譯期類型安全,避免 ClassCastException。
  • 只存引用:基本類型需自動裝箱(int → Integer),注意性能開銷。

二、List 族系深度解析

2.1 ArrayList:動態數組,隨機訪問之王

特性詳解
底層結構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

2.2 LinkedList:雙向鏈表,首尾操作專家

  • 底層:Node<E> 節點類,含 prev/next 指針,維護 first/last 哨兵。
  • 優勢:頭尾增刪 O(1),實現 Deque、Queue 接口,天然支持棧/隊列操作(push/pop、offer/poll)。
  • 劣勢:隨機訪問 O(n/2),內存開銷大(每個節點 3 個引用),CPU 緩存命中率低。
  • 選型:頻繁頭尾操作、作為隊列/棧用時首選;其餘場景 ArrayList 通常更快。

2.3 Vector & Stack:歷史遺留,慎用

  • Vector:所有方法 synchronized,性能差,已被 Collections.synchronizedList / CopyOnWriteArrayList 替代。
  • Stack:繼承 Vector,push/pop/peek 操作棧頂,推薦用 ArrayDeque 替代(雙端隊列,性能更強、API 更豐富)。

三、Set 族系:去重與有序的藝術

3.1 HashSet:哈希去重,性能基準

  • 本質:包裝 HashMap<E, Object>,值統一用 PRESENT 佔位對象。
  • 核心契約:重寫 equals() 必須重寫 hashCode(),且相等對象哈希碼必須相等。
  • 允許一個 null 元素,非線程安全。

3.2 LinkedHashSet:插入順序的守護者

  • 繼承 HashSet,內部維護雙向鏈表記錄插入序。
  • 遍歷輸出順序 = 添加順序,適合「去重且保持輸入序」場景(如 LRU 緩存鍵集合)。

3.3 TreeSet:紅黑樹有序,範圍查詢利器

  • 底層:TreeMap(紅黑樹),元素按自然順序(Comparable)或定製比較器(Comparator)排序。
  • 核心操作 O(log n):first()/last()、subSet()/headSet()/tailSet() 範圍視圖、lower()/higher() 鄰近查找。
  • 元素必須同類可比,否則拋 ClassCastException。

四、Map 族系:鍵值映射的終極指南

4.1 HashMap (JDK 1.8+):數組 + 鏈表/紅黑樹的進化

  • 核心字段:Node<K,V>[] table、size、threshold(擴容閾值 = 容量 × 載入因子 0.75)。
  • 關鍵優化:鏈表長度 ≥ 8 且容量 ≥ 64 時 樹化;≤ 6 時 退化 為鏈表。解決哈希碰撞攻擊導致性能退化至 O(n)。
  • put 流程:計算 hash → 定位索引 → 遍歷鏈表/樹覆蓋或新增 → 檢查擴容。
  • 允許 null key(僅一個,放索引 0)與多個 null value。

4.2 LinkedHashMap:雙重鏈表,順序與訪問的雙重保障

  • 繼承 HashMap,新增 head/tail 維護雙向鏈表。
  • 兩種順序模式:
    • 插入順序(默認): accessOrder=false,put 不移動節點。
    • 訪問順序: accessOrder=true,get/put 將節點移至尾部 —— LRU 緩存核心實現。
  • 重寫 removeEldestEntry 實現定容 LRU:return size() > MAX_ENTRIES;

4.3 TreeMap:有序 Map,範圍操作首選

  • 紅黑樹實現 NavigableMap,鍵需實現 Comparable 或構造傳入 Comparator。
  • 典型場景:按鍵排序輸出、尋找「大於/小於某鍵的最近項」、區間統計。

4.4 ConcurrentHashMap (JDK 1.8+):高並發 Map 的黃金標準

  • 放棄 Segment 分段鎖,採用 CAS + synchronized (節點首部) + 紅黑樹 細粒度鎖。
  • get 無鎖(volatile Node[] table 保證可見性),put 僅鎖定目標桶首節點。
  • 擴容支持多線程協助 transfer,size() 用 LongAdder 思想統計。
  • 禁用 null key/value,避免歧義(get(null) 無法區分「不存在」與「值為 null」)。

4.5 Hashtable & Properties:博物館展品

  • Hashtable:全方法 synchronized,單鎖性能極差,已被 ConcurrentHashMap 完全取代。
  • Properties:繼承 Hashtable,專用於配置文件加載(load/store),鍵值均為 String。

五、輔助工具類:Collections 與 Arrays

  • 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 鍵值
鍵值映射、需插入/訪問序LinkedHashMapLRU 緩存設 accessOrder=true
鍵值映射、需鍵有序、範圍查詢TreeMap
單線程、簡單映射HashMap預設容量避免擴容

七、總結

Java 集合框架的精妙在於:接口定義語義,實現封裝數據結構與演算法。深入理解底層結構(動態數組、鏈表、紅黑樹、哈希表)、核心參數(載入因子、擴容閾值、樹化閾值)與線程安全機制(fail-fast、CAS、分段鎖、細粒度鎖),才能在海量數據、高併發、低延遲的實戰中做出最優選型,寫出經得起生產環境考驗的代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved