集合框架是 Java 開發中處理資料群組的標準工具。不同於固定大小、單一類型的陣列,集合提供動態擴容、異構儲存、豐富操作 API。本文為初學者梳理集合體系架構、核心特性與基本用法。
集合是物件的容器,可儲存任意類型、任意數量的物件引用。
| 特性 | 陣列 | 集合 |
|---|---|---|
| 大小 | 固定,創建時指定 | 動態,自動擴容 |
| 類型 | 單一類型 (基本類型或引用類型) | 統一為 Object 引用,可儲存不同類型 |
| 功能 | 基本索引存取 | 豐富 API:增刪改查、排序、搜尋、串流操作 |
| 記憶體 | 連續分配,基本類型存值 | 堆上物件引用,額外物件頭開銷 |

java.util.Collection (根介面)
├── java.util.List (有序、可重複)
│ ├── ArrayList (動態陣列,查詢快)
│ ├── LinkedList (雙向鏈表,增刪快)
│ └── Vector (同步陣列,舊版遺留)
└── java.util.Set (無序、不可重複)
├── HashSet (哈希表,效能最佳)
├── LinkedHashSet (鏈表+哈希,保持插入序)
└── TreeSet (紅黑樹,自動排序)
java.util.Map (鍵值映射,Key 唯一)
├── HashMap (哈希表,通用首選)
├── LinkedHashMap (保持插入/存取序)
├── TreeMap (紅黑樹,Key 排序)
└── Hashtable (同步哈希表,舊版遺留)
| 介面 | 有序性 | 重複性 | 索引存取 | 典型實現 | 核心場景 |
|---|---|---|---|---|---|
| List | ✅ 插入序 | ✅ 允許 | ✅ get(index) | ArrayList, LinkedList | 有序清單、佇列、棧 |
| Set | ❌ 無序 (除 LinkedHashSet/TreeSet) | ❌ 唯一 | ❌ 無索引 | HashSet, TreeSet | 去重、標籤、唯一 ID 集合 |
| Map | ❌ 無序 (除 LinkedHashMap/TreeMap) | Key 唯一 Value 可重複 | ✅ get(key) | HashMap, TreeMap | 字典、快取、索引映射 |
List list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add(1, "Orange"); // 指定位置插入
System.out.println(list.get(0)); // Apple
list.remove("Banana"); // 按值刪除
list.remove(0); // 按索引刪除
for (String fruit : list) { System.out.println(fruit); }
Set set = new HashSet<>();
set.add(1);
set.add(2);
set.add(1); // 重複元素不會添加
System.out.println(set.size()); // 2
System.out.println(set.contains(2)); // true
Map map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 3);
map.put("apple", 10); // Key 相同,Value 覆蓋
System.out.println(map.get("apple")); // 10
System.out.println(map.getOrDefault("orange", 0)); // 0 (預設值)
// 遍歷三種方式
for (String key : map.keySet()) { ... }
for (Integer value : map.values()) { ... }
for (Map.Entry entry : map.entrySet()) { ... }
JDK 5+ 引入泛型,編譯期檢查類型:
List list = new ArrayList<>();
list.add("Hello");
// list.add(123); // 編譯錯誤:型別不匹配
String s = list.get(0); // 無需強制轉型
注意:泛型為編譯期擦除,執行期實際仍為 List,但編譯器保證類型安全。
// 錯誤:ConcurrentModificationException
for (String s : list) { if (s.equals("x")) list.remove(s); }
// 正確:使用 Iterator
Iterator it = list.iterator();
while (it.hasNext()) { if (it.next().equals("x")) it.remove(); }
// 或 Java 8+
list.removeIf(s -> s.equals("x"));
// 低效:兩次查找
for (String key : map.keySet()) { map.get(key); }
// 高效:單次遍歷
for (Map.Entry entry : map.entrySet()) { ... }
equals() 和 hashCode(),否則 HashSet/HashMap 無法正確判斷相等new ArrayList<>(1000)、new HashMap<>(1024) 減少擴容開銷stream()、parallelStream()、Collector 收集器學習建議:先熟練掌握 ArrayList、HashSet、HashMap 三大「王者」的基本操作,再根據業務需求 (排序、並發、去重、佇列) 學習對應專用實現。理解資料結構原理 (陣列、鏈表、哈希表、紅黑樹) 是進階的關鍵。
集合框架是 Java 開發的基石,投入時間徹底掌握,將在日後無數次編碼中收獲回報。