Joshua Bloch 重構的 Java 2 容器框架分兩大族群:Collection(單一元素序列)與Map(鍵值對)。本文聚焦 Collection 下最核心的 List(有序、可重複) 與 Set(唯一、無序) 體系。
Iterator:單向移動,next()/hasNext()/remove(),輕量級物件。ListIterator:雙向遍歷,支援插入/刪除/定位,專為 List 設計。| 實作 | 底層結構 | 隨機存取 | 中間增刪 | 適用場景 |
|---|---|---|---|---|
| ArrayList | 動態陣列 | O(1) 極快 | O(n) 慢,需搬移 | 預設首選,頻繁讀取、少量尾部增刪 |
| LinkedList | 雙向鏈表 | O(n) 慢 | O(1) 快,僅調整指標 | 頻繁中間增刪、堆疊/佇列/雙端佇列 |
關鍵建議:ListIterator 僅用於 ArrayList 逆向遍歷,嚴禁用於 ArrayList 插刪(效能災難)。LinkedList 獨有 addFirst/Last、getFirst/Last、removeFirst/Last 可直接作堆疊/佇列。
| 實作 | 底層結構 | 查詢速度 | 順序保證 | 適用場景 |
|---|---|---|---|---|
| HashSet | 雜湊表 | O(1) 最快 | 無序 | 高頻查詢、不需順序 |
| TreeSet | 紅黑樹 | O(log n) | 自然排序/定製 Comparator | 需有序序列、區間查詢 |
| LinkedHashSet | 雜湊表+雙向鏈表 | O(1) | 插入順序 | 需快速查詢且保持插入序 |
核心契約:存入 Set 的物件必須正確覆寫 equals() 與 hashCode(),否則唯一性判斷失效。自訂類別若需 TreeSet 排序,須實作 Comparable 或提供 Comparator。
Map 儲存鍵值對,可輸出 keySet()、values()、entrySet(),支援多維嵌套(值為 Map),典型應用:資料字典、快取、索引。
掌握容器特性與契約,是寫出高效、正確 Java 代碼的基礎功力。