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

Java 集合框架深度解析:Collection/List/Set/Map/Queue 體系架構、核心接口與實現類選型指南

     編輯:Java 綜合教學

Java 集合框架 — 程序員必修的數據結構與算法基礎設施

集合框架是 Java API 中使用頻率最高、設計最精妙的部分之一。它統一了對「對象組」的表示與操作,提供高性能數據結構 (動態數組、鏈表、紅黑樹、哈希表、堆) 與通用算法 (排序、查找、洗牌)。本文系統梳理架構、核心接口契約、主流實現類特性、選型決策樹。

一、 集合框架三大支柱

  1. 接口:抽象數據類型 (ADT),定義操作契約 (如 `List` 有序可重複, `Set` 無序唯一, `Map` 鍵值映射)。
  2. 實現:具體數據結構 (如 `ArrayList` 動態數組, `HashMap` 哈希表+紅黑樹)。
  3. 算法:`Collections`/`Arrays` 靜態方法 (排序、二分查找、填充、複製、反轉、洗牌),多態作用於接口實現。

二、 接口繼承體系圖

java.lang.Iterable
└── java.util.Collection (根接口)
    ├── java.util.List (有序, 可重複, 可索引訪問)
    │   ├── java.util.ArrayList
    │   ├── java.util.LinkedList
    │   ├── java.util.Vector (同步, 老舊)
    │   └── java.util.Stack (Vector 子類, 不推薦)
    ├── java.util.Set (無序, 唯一, 無索引)
    │   ├── java.util.HashSet (HashMap 鍵, 無序)
    │   ├── java.util.LinkedHashSet (鏈表維護插入序)
    │   └── java.util.TreeSet (紅黑樹, 自然序/比較器序)
    └── java.util.Queue (隊列, FIFO/優先級)
        ├── java.util.PriorityQueue (堆, 優先級隊列)
        ├── java.util.ArrayDeque (雙端隊列, 非線程安全, 高性能)
        └── java.util.concurrent.BlockingQueue (阻塞隊列接口)
            
java.util.Map (獨立根接口, 鍵值對)
    ├── java.util.HashMap (數組+鏈表/紅黑樹, 無序)
    ├── java.util.LinkedHashMap (雙向鏈表維護插入/訪問序)
    ├── java.util.TreeMap (紅黑樹, 有序)
    ├── java.util.Hashtable (同步, 老舊)
    └── java.util.Properties (Hashtable 子類, 配置文件)

集合框架架構圖 Collection接口 Map接口

三、 Collection 接口核心契約

public interface Collection extends Iterable {
    // 基礎操作
    int size(); boolean isEmpty();
    boolean contains(Object o);
    boolean add(E e);           // 可選操作
    boolean remove(Object o);   // 可選操作
    Iterator iterator();     // 唯一遍歷方式
    
    // 批量操作
    boolean containsAll(Collection c);
    boolean addAll(Collection c);
    boolean removeAll(Collection c);
    boolean retainAll(Collection c); // 保留交集
    void clear();
    
    // 轉數組
    Object[] toArray();
     T[] toArray(T[] a);
}

四、 迭代器 — 統一遍歷抽象

public interface Iterator {
    boolean hasNext();
    E next();
    void remove(); // 可選:從底層集合移除最後 next() 返回的元素
}

// ListIterator (List 專用,雙向、可修改、可定位)
public interface ListIterator extends Iterator {
    boolean hasPrevious(); E previous(); int nextIndex(); int previousIndex();
    void set(E e); void add(E e);
}

foreach 語法糖:`for (E e : coll) {}` 編譯器自動轉換為 `Iterator` 模式。**遍歷時不可修改集合結構** (增/刪),否則拋 `ConcurrentModificationException` (fail-fast)。

五、 主流實現類深度對比與選型指南

1. List 實現

實現底層結構隨機訪問頭尾增刪中間增刪線程安全適用場景
ArrayList動態數組O(1) ✅O(1) 擴容均攤O(n) 需移動❌**默認首選**:頻繁隨機訪問、尾部增刪、作為堆棧
LinkedList雙向鏈表O(n) ❌O(1) ✅O(1) 定位後❌頻繁頭部/中間增刪、實現隊列/棧 (Deque)
Vector動態數組O(1)O(1)O(n)✅ 方法級 synchronized**棄用**:性能差,用 `Collections.synchronizedList` 或 `CopyOnWriteArrayList`

2. Set 實現

實現底層有序性性能 (增/刪/查)Null 元素適用場景
HashSetHashMap無序O(1)允許 1 個**默認首選**:去重、集合運算 (交/並/差)、高性能查找
LinkedHashSetLinkedHashMap插入序O(1)允許 1 個需保持插入順序的去重 (如 LRU 緩存鍵集)
TreeSetTreeMap (紅黑樹)自然序/比較器序O(log n)不允許需有序集合、範圍查詢 (subSet, headSet, tailSet)

3. Map 實現

實現底層有序性性能Null Key/Value適用場景
HashMap數組+鏈表/紅黑樹 (JDK8)無序O(1)允許 1 Key, 多 Value**默認首選**:緩存、索引、計數、鍵值存儲
LinkedHashMapHashMap + 雙向鏈表插入序/訪問序O(1)允許LRU 緩存 (accessOrder=true)、保持配置文件順序
TreeMap紅黑樹Key 自然序/比較器序O(log n)不允許 Null Key有序映射、範圍查詢、一致性哈希環節點
Hashtable數組+鏈表無序O(1) 同步開銷大不允許 Null**棄用**:用 `ConcurrentHashMap` (JDK8 CAS+ synchronized)
ConcurrentHashMap數組+鏈表/紅黑樹 + CAS/synchronized無序高併發 O(1)不允許 Null**多線程首選**:高併發緩存、計數器

4. Queue/Deque 實現

  • ArrayDeque:循環數組雙端隊列,**非線程安全、性能極高**,單線程棧/隊列首選 (替代 `Stack`/`LinkedList`)。
  • PriorityQueue:最小堆,按優先級出隊 (自然序/比較器),**非線程安全**。
  • BlockingQueue (接口):`ArrayBlockingQueue` (有界數組)、`LinkedBlockingQueue` (鏈表、可無界)、`SynchronousQueue` (直接移交)、`DelayQueue` (延遲)、`PriorityBlockingQueue`。**多線程生產消費首選**。

六、 Java 8+ 增強:Arrays 並行操作

int[] arr = {3, -4, 25, 16, 30, 18};
Arrays.parallelSort(arr);           // 多線程並行排序 (大數組顯著加速)
Arrays.parallelPrefix(arr, (x,y)->x*y); // 並行前綴累積 (1, -4, -100, -1600...)
Arrays.parallelSetAll(new int[5], i -> i*5); // 並行生成 [0,5,10,15,20]

七、 避坑指南

  1. 遍歷刪除:必須用 `Iterator.remove()` 或 `removeIf()` (Java 8),不可直接 `coll.remove()` 或 foreach 中刪除。
  2. HashMap 多線程:高併發 `put` 導致鏈表成環 CPU 100%,**必用 `ConcurrentHashMap`**。
  3. 初始化容量:大數據量預估 `new ArrayList<>(10000)`、`new HashMap<>(1024)` 避免擴容開銷。
  4. equals/hashCode:作為 `Set` 元素或 `Map` Key 的對象,**必須正確重寫**。
  5. 集合轉數組:`toArray(new T[0])` (JDK 11+) 或 `toArray(new T[size])`,避免 `Object[]` 強轉失敗。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved