Java 集合框架以 Collection、Map 為雙核心,統一了資料結構操作介面。本文梳理介面繼承體系、核心實現類 (ArrayList/LinkedList/HashSet/HashMap) 關鍵方法原始碼邏輯、迭代器模式、泛型用法,附完整可運行示例代碼。
一、介面繼承體系
Iterable (根)
└─ Collection
├─ List (有序、可重複) → ArrayList, LinkedList, Vector, Stack
├─ Set (無序、不可重複) → HashSet, LinkedHashSet, TreeSet
└─ Queue (佇列) → PriorityQueue, ArrayDeque, LinkedList
Map (獨立介面,鍵值映射) → HashMap, LinkedHashMap, TreeMap, Hashtable, ConcurrentHashMap
Collection 繼承 Iterable → 統一支援 for-each 與 iterator()
AbstractCollection 提供骨架實現,減少子類開發量
二、List 兩大主力原始碼級剖析
ArrayList (動態陣列)
add(E):末尾添加,滿時擴容 1.5倍+1,Arrays.copyOf
add(index, E):System.arraycopy 後移元素,插入
remove(index):後移元素覆蓋,末尾置 null
get/set(index):陣列下標直達,**O(1) 極快**
LinkedList (雙向鏈表)
- 內部類
Node<E> { E item; Node<E> next, prev; }
add(E):尾節點前插入,修改 4 個指標,**O(1)**
add(index, E):先遍歷定位 (二分優化:從頭/尾較近端起步),再改指標
remove(index):定位後斷開指標,**無搬移**
get/set(index):需遍歷,**O(N)**
結論:大量隨機存取 → ArrayList;頻繁中間增刪 → LinkedList。
三、Set 與查找優化
HashSet:底層 HashMap,add/contains/remove 平均 **O(1)**,首選
TreeSet:紅黑樹,**有序**,O(log N)
LinkedHashSet:雜湊 + 鏈表,**保持插入順序**
四、迭代器設計模式
| 介面 | 適用範圍 | 關鍵方法 |
| Iterator | 所有 Collection | hasNext(), next(), remove() |
| ListIterator | 僅 List | + hasPrevious(), previous(), add(), set() |
Iterator 為輕量級物件,統一遍歷介面,支援 remove() 安全刪除。
五、Map 鍵值映射核心操作
put(K, V) / get(K):雜湊定位桶位,鏈表/樹中比對 equals()
keySet() / values() / entrySet():三種視圖遍歷
HashMap:無序、高效;TreeMap:有序;LinkedHashMap:插入/存取序
六、完整示例代碼
List + Iterator 實戰
import java.util.*;
public class ListDemo {
public static void main(String[] args) {
Collection<Integer> col = new ArrayList<>(Arrays.asList(10,20,30));
List<Integer> list = new LinkedList<>();
list.addAll(col);
list.add(40); list.add(50); list.add(60);
// Iterator 單向遍歷 + 安全刪除
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer v = it.next();
System.out.print(v + " ");
if (v == 50) it.remove(); // 安全刪除
}
System.out.println();
// ListIterator 雙向遍歷
ListIterator<Integer> li = list.listIterator();
while (li.hasNext()) System.out.print(li.next() + " "); // 正向
System.out.println();
while (li.hasPrevious()) System.out.print(li.previous() + " "); // 反向
}
}
Map 實戰
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
Map<String,Integer> hm = new HashMap<>();
hm.put("a1",1); hm.put("b2",2); hm.put("c3",3); hm.put("d4",4); hm.put("e5",5);
// 遍歷 entrySet (最高效)
for (Map.Entry<String,Integer> e : hm.entrySet()) {
System.out.println(e.getKey() + " : " + e.getValue());
}
System.out.println("Contains c3: " + hm.containsKey("c3"));
hm.remove("c3");
System.out.println("Contains value 3: " + hm.containsValue(3));
System.out.println("Size: " + hm.size());
}
}
七、最佳實踐提醒
- 介面宣告,實現注入:
List<T> list = new ArrayList<>(); 而非 ArrayList<T> list = ...
- 泛型完整參數化:避免原始型別警告
- 預估初始容量:
new ArrayList(1000) 減少擴容
- 善用 Collections 工具:
sort, binarySearch, unmodifiableList, synchronizedMap 等
- 上一篇文章: Java 集合框架精要 (一):List 族群特性、效能陷阱與最佳實踐
- 下一篇文章: Ruby 實戰筆記 (二):透過代理伺服器爬取網頁內容
Copyright ©
程式碼之家 All Rights Reserved