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

Java 集合框架源碼級剖析:架構、核心實現與選型指南

     編輯:Java 相關知識

集合框架整體架構

Java 集合框架位於 java.util 包,核心接口繼承體系:

java.lang.Iterable
    └── java.util.Collection
            ├── List (有序、可重複)
            │     ├── ArrayList (動態數組)
            │     ├── LinkedList (雙向鏈表/Deque)
            │     └── Vector (同步、舊版)
            ├── Set (無序、不可重複)
            │     ├── HashSet (HashMap 鍵集)
            │     ├── LinkedHashSet (有序 HashSet)
            │     └── TreeSet (TreeMap 鍵集,有序)
            └── Queue (隊列)
                  ├── PriorityQueue (堆)
                  ├── ArrayDeque (雙端隊列)
                  └── LinkedList (也實現 Deque)

Map (鍵值映射,非 Collection 子接口)
    ├── HashMap (數組+鏈表/紅黑樹)
    ├── LinkedHashMap (有序 HashMap)
    ├── TreeMap (紅黑樹,有序)
    ├── WeakHashMap (弱引用鍵)
    └── Hashtable (同步、舊版)
        └── Properties (配置屬性)

核心實現原理深度解析

ArrayList:動態數組

  • 底層:transient Object[] elementData
  • 擴容機制:grow() → newCapacity = oldCapacity + (oldCapacity >> 1) (1.5 倍)
  • 隨機訪問:O(1),實現 RandomAccess 標記接口
  • 插入刪除:O(n) 需數組拷貝 System.arraycopy
  • 適用:讀多寫少、隨機訪問、末尾增刪

LinkedList:雙向鏈表

  • 底層:Node first, last,雙向鏈表節點
  • 訪問:O(n) 需遍歷,無 RandomAccess
  • 首尾增刪:O(1)
  • 實現接口:List、Deque、Queue、Cloneable、Serializable
  • 適用:頻繁首尾操作、隊列/棧、迭代器操作

HashMap (JDK 8+):數組 + 鏈表 + 紅黑樹

  • 結構:Node[] table,桶數組
  • 掛鏈閾值:鏈表長度 ≥ 8 且數組長度 ≥ 64 → 紅黑樹
  • 退化閾值:樹節點 ≤ 6 → 退回鏈表
  • 擴容:負載因子 0.75,容量 2 的冪次,resize() 重新雜湊分佈
  • 關鍵優化:hash(key) = key.hashCode() ^ (key.hashCode() >>> 16),高低位混合減少碰撞

HashSet:HashMap 鍵集包裝

// 內部實現極簡
private transient HashMap map;
private static final Object PRESENT = new Object();

public boolean add(E e) { return map.put(e, PRESENT) == null; }

TreeMap/TreeSet:紅黑樹有序實現

  • 基於紅黑樹(自平衡二叉搜索樹),O(log n) 增刪查
  • 鍵需實現 Comparable 或提供 Comparator
  • 支持範圍查詢:subMap()、headMap()、tailMap()

ConcurrentHashMap (JDK 8+):CAS + synchronized 細粒度鎖

  • 放棄 Segment 分段鎖,採用 Node[] table + synchronized (首節點) + CAS
  • 擴容支持多線程協助 transfer()
  • size() 使用 LongAdder 累加器高效統計

抽象類適配器模式

AbstractCollection、AbstractList、AbstractSet、AbstractMap 提供模板方法,子類僅需實現核心抽象方法:

抽象類核心抽象方法典型子類
AbstractCollectioniterator()、size()ArrayList、HashSet
AbstractListget(index)、set(index, element)ArrayList、LinkedList
AbstractSet繼承 AbstractCollectionHashSet、TreeSet
AbstractMapentrySet()HashMap、TreeMap

迭代器設計模式

  • Iterator:單向遍歷,hasNext()、next()、remove()、forEachRemaining()
  • ListIterator:雙向遍歷,支持索引、添加、修改
  • Enumeration:舊版(Vector/Hashtable),僅 hasMoreElements()、nextElement()
  • 快速失效:非同步集合迭代器檢測 modCount 變化,拋 ConcurrentModificationException

工具類:Collections vs Arrays

工具類核心功能
Collections排序、二分查找、反轉、洗牌、同步包裝 synchronizedList()、不可變視圖 unmodifiableList()、空集合、頻率統計
Arrays排序、二分查找、比較、填充、複製 copyOf()、轉 List asList()、流操作 stream()

選型決策矩陣

需求場景推薦集合備選避免使用
高頻隨機讀取、末尾增刪ArrayListVector (同步)LinkedList
高頻首尾增刪、隊列/棧ArrayDeque / LinkedListArrayList
去重、集合運算HashSetLinkedHashSet (保序)List + contains
有序去重、範圍查詢TreeSetHashSet + sort
鍵值映射、高併發讀寫ConcurrentHashMapHashMap + 手動同步Hashtable
鍵值映射、需保持插入序LinkedHashMapHashMap
鍵值映射、需自然序/自定義序TreeMapHashMap + sort keys
線程安全 List/Set/MapCollections.synchronizedXxx() / ConcurrentXxxCopyOnWriteArrayList (讀多寫極少)Vector/Hashtable

性能優化實戰建議

  1. 預估容量:new ArrayList<>(expectedSize)、new HashMap<>(expectedSize / 0.75f + 1) 避免多次擴容
  2. 優先介面編程:List list = new ArrayList<>(); 便於替換實現
  3. 避免原始類型集合:泛型編譯期類型安全,減少強轉
  4. 並發場景用並發集合:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue
  5. 不可變集合:JDK 9+ List.of()、Set.of()、Map.of(),線程安全、內存緊湊
  6. 流式處理:collection.stream()... 替代手動迭代,並行流利用多核

總結

Java 集合框架以 Collection 和 Map 為核心,通過數組、鏈表、哈希表、紅黑樹等數據結構實現豐富功能。掌握底層原理(擴容、雜湊、樹化)、核心 API 差異、線程安全模型、選型矩陣,能寫出高性能、無 Bug 的集合操作代碼。實戰中遵循「預估容量、介面編程、並發優先、不可變優先」原則。

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