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

《Thinking in Java》第 11 章閱讀筆記:容器深度解析——從數組到 Collection/Map 體系

     編輯:Java 相關知識

《Thinking in Java》第 11 章閱讀筆記:容器深度解析——從數組到 Collection/Map 體系

本章系統講解 Java 容器類別體系,核心對比:**數組 vs 容器**、**Collection vs Map**、各實現類適用場景、迭代器模式、比較策略、散列機制。筆記提煉核心知識點與代碼範例,作為快速查閱手冊。

1. 數組:最高效、固定容量、支援基本型別

  • 優勢:隨機存取最快、編譯期類型檢查、可持有基本型別。
  • 劣勢:容量不可變、無自動擴容、無豐富操作 API。
  • Arrays 工具類:equals()、fill()、sort()、binarySearch()、asList()。
  • 淺拷貝:System.arraycopy() 複製引用,不複製物件本身。

2. 容器概覽:持有 Object 引用、自動擴容、類型資訊擦除

  • 所有容器持有 Object 引用,取出需強轉(基本型別需包裝類)。
  • 優點:通用性極強;缺點:編譯期不檢查類型、執行期可能 ClassCastException。
  • Java 2 重新設計:結構緊湊、補齊 LinkedList/Queue/Deque 等資料結構。

3. Collection 體系:List / Set

介面特徵典型實現適用場景
List有序、允許重複、支援隨機存取ArrayList★、LinkedListArrayList:頻繁隨機存取;LinkedList:頻繁頭尾/中間插入刪除、棧/隊列/雙端隊列
Set無序、不允許重複、依 equals/hashCode 判重HashSet★、TreeSet、LinkedHashSetHashSet:極速查詢;TreeSet:有序集合;LinkedHashSet:保持插入順序

add() 語義差異:List 總是添加;Set 僅添加不存在元素。

4. Map 體系:鍵值關聯

實現特徵適用場景
HashMap★散列表、O(1) 查詢/插入、無序通用鍵值存取,效能優先
TreeMap紅黑樹、鍵有序、O(log n)需有序遍歷、範圍查詢
LinkedHashMap散列 + 雙向鏈表、保持插入/訪問順序需可預測迭代順序、LRU 快取
WeakHashMap弱引用鍵、適合快取、GC 可回收元資料註冊表、快取
IdentityHashMap用 == 比較鍵、特殊用途圖遍歷標記、序列化輔助

5. 迭代器模式:統一遍歷介面

  • Iterator:hasNext()、next()、remove() —— 單向、輕量級。
  • ListIterator(List 專用):雙向、可修改、可定位索引。
  • 設計模式精髓:**客戶代碼不依賴具體容器結構**,僅依賴 Iterator 介面。

6. 比較策略:Comparable vs Comparator

  • Comparable:內建比較(compareTo()),類自帶排序邏輯。
  • Comparator:外部策略(策略模式),compare(o1,o2),可定義多種排序規則。
  • Collections.reverseOrder() 返回反序 Comparator。
  • 排序演算法:基本型別用 QuickSort,物件用穩定 MergeSort。

7. 散列機制與 equals/hashCode 契約

equals 五大契約:自反性、對稱性、傳遞性、一致性、非空性。

hashCode 契約:

  • equals 相等 ⇒ hashCode 必相等。
  • equals 不等 ⇒ hashCode **可相等**(碰撞),但應盡量分散。
  • 未覆寫 hashCode 時,預設為物件記憶體地址衍生值,**導致散列容器失效**。

**必須同時覆寫 equals 和 hashCode** 才能作為 HashMap/HashSet 鍵/元素。

8. 弱引用與垃圾回收輔助

  • SoftReference:記憶體不足才回收,適合快取。
  • WeakReference:GC 掃描即回收,適合 Canonicalizing Mapping。
  • PhantomReference:最終化前通知,極少用。

9. 總結:容器選型決策樹

需要基本型別/固定大小/最高效能 → 數組
需要自動擴容、豐富操作 → 容器
  ├─ 單一元素集合 → Collection
  │   ├─ 需有序、可重複、隨機存取 → ArrayList
  │   ├─ 需頻繁頭尾/中間增刪 → LinkedList
  │   ├─ 需唯一、極速查詢 → HashSet
  │   ├─ 需唯一、有序 → TreeSet
  │   └─ 需唯一、保持插入順序 → LinkedHashSet
  └─ 鍵值關聯 → Map
      ├─ 極速查詢、無序 → HashMap
      ├─ 鍵有序、範圍查詢 → TreeMap
      └─ 保持插入/訪問順序 → LinkedHashMap

10. 遺棄舊類

Vector、Hashtable、Stack 為 1.0/1.1 遺留,**同步開銷大、API 設計不佳**,新代碼**嚴禁使用**,改用上述現代替代品。

「容器類庫是每天都會用到的工具,掌握其選型邏輯,能寫出更簡潔、更強大、更高效的代碼。本章雖耗時長,但未動手敲代碼感覺像沒看,必須配合書上範例逐行實作才能內化。」

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