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

Java 核心技術卷 I:集合框架完整圖譜與實戰精要

     編輯:Java 相關知識

前言

《Java 核心技術 卷 I》第 13 章詳細闡述了集合框架。本文將海量圖表知識點提煉為結構化知識體系,輔以核心 API 對比與實戰選型指南。

一、集合體系總覽

1.1 核心介面繼承關係

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)

1.2 關鍵實作類對比表

類別底層結構有序性允許Null執行緒安全適用場景
ArrayList動態陣列插入序是否隨機存取、尾部增刪
LinkedList雙向鏈表插入序是否頻繁頭尾增刪、佇列/棧
HashSetHashMap無序一個否去重、集合運算
TreeSet紅黑樹自然序/比較器否否排序、範圍查詢
HashMap陣列+鏈表/紅黑樹無序一個Key/多Value否高效鍵值查找
ConcurrentHashMapCAS+synchronized+Node無序否是(分段鎖)高併發讀寫

二、核心實作深度解析

2.1 ArrayList 動態擴容機制

  • 預設容量 10,擴容 1.5 倍:newCapacity = oldCapacity + (oldCapacity >> 1)
  • 擴容涉及 Arrays.copyOf,頻繁擴容影響效能 → **預估大小用 `ensureCapacity`**
  • 隨機存取 O(1),中間插入/刪除 O(n) 需位移

2.2 HashMap JDK 8 關鍵優化

  • 鏈表長度 > 8 且陣列長度 >= 64 → **轉紅黑樹**
  • 樹節點 < 6 → **退化為鏈表**
  • 解決高雜湊衝突下的 O(n) 惡化問題
  • putVal 流程:雜湊計算 → 索引定位 → 鏈表/樹遍歷 → 覆蓋或新增 → 擴容檢查

2.3 LinkedHashMap 維護順序的秘密

  • 雙向鏈表貫穿所有 Entry
  • 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/copy
  • Collections.synchronizedList/Set/Map:包裝器模式提供同步視圖
  • Collections.unmodifiableList/Set/Map:不可變視圖,防禦性程式設計

六、遺留類別與現代替代

遺留類別現代替代說明
VectorArrayList / CopyOnWriteArrayList同步開銷大
StackArrayDequeDeque 介面更豐富
HashtableConcurrentHashMap分段鎖效能遠優於全鎖
EnumerationIterator支援 remove()、forEachRemaining()

七、效能調優黃金法則

  1. 預估初始容量:`new ArrayList<>(estimatedSize)`、`new HashMap<>(estimatedSize / 0.75f + 1)`
  2. 優先介面宣告:`List list = new ArrayList<>()`,便於替換實作
  3. 避免在迴圈中自動裝箱:基本型別集合用 IntList (Eclipse Collections) 或流式處理
  4. 並行流謹慎用:小資料集合並行開銷大於收益
  5. 快取熱點資料用 WeakHashMap / Caffeine / Guava Cache,而非手工 Map

總結

Java 集合框架是「介面 + 實作 + 演算法」的經典結合。深入理解底層資料結構(陣列、鏈表、紅黑樹、雜湊表)、擴容機制、併發實現,才能在實際業務中做出最優選型,寫出高效、穩健的程式碼。

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