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

Java 集合框架繼承結構圖解:Collection/Map 體系全景圖

     編輯:Java 相關知識

集合框架核心體系概覽

Java 集合框架分為兩大頂層接口:Collection(單列集合)和 Map(雙列鍵值對)。

┌─────────────────────────────────────────────────────────────┐
│                    java.util.Collection                       │
│  (單列集合,存儲單個元素)                                      │
├──────────────┬──────────────┬──────────────┬────────────────┤
│    List      │     Set      │    Queue     │   SortedSet    │
│  (有序,可重複)│ (無序,唯一)   │   (隊列)      │   (有序Set)     │
└──────┬───────┴──────┬───────┴──────┬───────┴───────┬────────┘
       │              │              │               │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ ArrayList   │ │  HashSet    │ │ LinkedList  │ │  TreeSet    │
│ LinkedList  │ │ LinkedHashSet│ │ PriorityQueue│ │             │
│ Vector      │ │  TreeSet    │ │ ArrayDeque  │ │             │
└─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘
┌─────────────────────────────────────────────────────────────┐
│                        java.util.Map                          │
│  (雙列集合,存儲 key-value,key 唯一)                          │
├──────────────┬──────────────┬──────────────┬────────────────┤
│   HashMap    │  LinkedHashMap│   TreeMap    │   Hashtable    │
│  (無序,高性能) │ (有序,插入序)  │ (有序,按鍵排序) │ (線程安全,舊)   │
└──────────────┴──────────────┴──────────────┴────────────────┘

Collection 接口核心方法

分類方法說明
添加add(E e)添加單個元素
addAll(Collection<? extends E> c)批量添加
刪除remove(Object o)刪除指定元素
removeAll(Collection<?> c)批量刪除
clear()清空集合
判斷contains(Object o)是否包含元素
isEmpty()是否為空
獲取iterator()獲取迭代器
size()元素數量
交集retainAll(Collection<?> c)保留交集
轉數組toArray()轉為 Object[]

List 接口:有序、可重複、支持索引

特有方法(索引相關)

方法說明
add(int index, E element)指定位置插入
addAll(int index, Collection<? extends E> c)指定位置批量插入
remove(int index)按索引刪除
set(int index, E element)按索引替換
get(int index)按索引獲取
subList(int from, int to)截取子列表
indexOf(Object o)首次出現索引
listIterator()列表迭代器(雙向)

三大實現類對比

實現類底層結構線程安全查詢速度增刪速度適用場景
ArrayList動態數組❌快 O(1)慢 O(n) (需移位)查詢多、末尾增刪
LinkedList雙向鏈表❌慢 O(n)快 O(1) (首尾)頻繁增刪、棧/隊列
Vector動態數組✅ (synchronized)快慢已棄用,用 Collections.synchronizedList

Set 接口:無序、唯一

HashSet:哈希表,性能最優

  • 底層:HashMap (key 為元素,value 為 PRESENT 常量)
  • 唯一性判斷:hashCode() 相同 → equals() 比較
  • 插入順序不保證

LinkedHashSet:保持插入順序

  • 底層:LinkedHashMap (雙向鏈表維護順序)
  • 遍歷順序 = 插入順序

TreeSet:有序(紅黑樹)

  • 底層:TreeMap (紅黑樹)
  • 自然排序:元素實現 Comparable
  • 定制排序:構造器傳入 Comparator
  • 唯一性判斷:compareTo() == 0 或 compare() == 0

Queue 接口:隊列

實現類特點適用場景
LinkedList雙向鏈表,實現 Deque普通隊列、棧
PriorityQueue優先隊列(小頂堆)任務調度、按優先級處理
ArrayDeque循環數組,雙端隊列高性能棧/隊列,非線程安全
BlockingQueue阻塞隊列接口生產者消費者模式

Map 接口:鍵值對、Key 唯一

核心方法

分類方法
添加put(K, V)、putAll(Map)
刪除remove(Object key)、clear()
判斷containsKey、containsValue、isEmpty
獲取get(Object key)、size()、values()、keySet()、entrySet()

四大實現類對比

實現類底層有序性Null Key/Value線程安全JDK 版本
HashMap數組+鏈表/紅黑樹無序允許 1個 null key、多 null value❌1.2+
LinkedHashMapHashMap+雙向鏈表插入序/訪問序允許❌1.4+
TreeMap紅黑樹按 Key 排序不允許 null key❌1.2+
Hashtable數組+鏈表無序不允許 null✅ (synchronized)1.0 (舊)
ConcurrentHashMapCAS+volatile / 紅黑樹無序不允許 null✅ (高並發)1.5+

集合遍歷方式對比

方式適用優點缺點
IteratorCollection通用、可刪除只能單向遍歷
ListIteratorList雙向、可增刪改、有索引只適用 List
for-eachCollection/數組語法簡潔不可修改集合結構
forEach (Java 8)Collection/Map函數式、可並行不可拋出檢查異常
EnumerationVector/Hashtable舊 API 兼容功能弱、已棄用

⚠️ 并發修改異常


// ❌ 錯誤:遍歷時直接用集合方法修改
for (String s : list) {
    if ("x".equals(s)) list.remove(s); // ConcurrentModificationException
}

// ✅ 正確:用迭代器刪除
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    if ("x".equals(it.next())) it.remove();
}

// ✅ 正確:Java 8 removeIf
list.removeIf("x"::equals);

// ✅ 正確:收集後再刪
List<String> toRemove = new ArrayList<>();
for (String s : list) if ("x".equals(s)) toRemove.add(s);
list.removeAll(toRemove);

Collections 工具類 vs Collection 接口

CollectionCollections
類型頂層接口工具類 (final class)
方法實例方法靜態方法
功能定義集合行為排序、查找、同步包裝、不可變視圖

Collections 常用靜態方法


// 排序
Collections.sort(list);                    // 自然排序
Collections.sort(list, comparator);        // 定制排序

// 查找 (前提:已排序)
int index = Collections.binarySearch(list, key);

// 同步包裝 (線程安全視圖)
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>());
Set<E> syncSet = Collections.synchronizedSet(new HashSet<>());

// 不可變視圖 (只讀)
List<String> unmod = Collections.unmodifiableList(list);
Map<K,V> unmodMap = Collections.unmodifiableMap(map);

// 其他
Collections.reverse(list);           // 反轉
Collections.shuffle(list);           // 隨機打亂
Collections.max/min(collection);     // 極值
Collections.frequency(c, o);         // 出現次數
Collections.disjoint(c1, c2);        // 是否無交集

選型決策樹

需要存儲單個元素?
├─ 需要索引訪問、允許重複 → ArrayList (首選) / LinkedList (頻繁增刪)
├─ 不允許重複、無序 → HashSet (首選)
├─ 不允許重複、保持插入序 → LinkedHashSet
├─ 不允許重複、需要排序 → TreeSet
└─ 隊列操作 (FIFO/LIFO) → ArrayDeque / LinkedList / PriorityQueue

需要存儲鍵值對?
├─ 高性能查找、無序 → HashMap (首選)
├─ 保持插入順序 → LinkedHashMap
├─ Key 需要排序 → TreeMap
├─ 多線程高並發 → ConcurrentHashMap
└─ 歷史兼容 → Hashtable (不推薦)

總結

Java 集合框架設計精妙,核心掌握:Collection/Map 兩大體系、List/Set/Queue 三大子體系、ArrayList/LinkedList/HashSet/HashMap 四大主力實現、遍歷用 Iterator/for-each、線程安全用 Collections.synchronizedXxx/ConcurrentHashMap、避坑 ConcurrentModificationException。實際開發中 90% 場景用 ArrayList 和 HashMap 即可覆蓋。

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