本文基於《Thinking in Java》第 4 版第 11 章持有對象,系統梳理 Map 接口層次結構、三大主流實現類原理、性能特徵、選型指南與源碼關鍵點。

Map<K,V>:根接口,不繼承 Collection,提供 Key-Value 映射,Key 唯一,Value 可重複。AbstractMap<K,V>:骨幹實現,僅留 entrySet() 抽象,限制 put() 拋出 UnsupportedOperationException。public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
ConcurrentModificationException。public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
head/tail,記錄插入順序 (默認) 或訪問順序 (accessOrder=true)。newNode()、newTreeNode()、afterNodeAccess()、afterNodeInsertion()、get()、clear()、containsValue()。LinkedHashMap(16, 0.75f, true) + 覆寫 removeEldestEntry() 實現。Comparable) 或定制比較器 (Comparator) 排序。get/put/remove/containsKey 均為 O(log n)。firstKey/lastKey、lowerKey/floorKey/ceilingKey/higherKey、subMap/headMap/tailMap、pollFirstEntry/pollLastEntry。| 特性 | HashMap | LinkedHashMap | TreeMap | ConcurrentHashMap | Hashtable |
|---|---|---|---|---|---|
| 順序 | 無序 | 插入序/訪問序 | Key 排序 | 無序 | 無序 | Null Key | 允許 (1個) | 允許 (1個) | 不允許 | 不允許 | 不允許 |
| 線程安全 | 否 | 否 | 否 | 是 (分段鎖/CAS) | 是 (同步方法) |
| 查找/插入/刪除 | O(1) 平均 | O(1) 平均 | O(log n) | O(1) 平均 | O(1) 同步開銷大 |
| 迭代性能 | O(capacity) | O(size) | O(size) | 弱一致性 | 同步 |
| 典型場景 | 通用緩存、計數 | LRU、有序配置 | 範圍查詢、排序 | 高併發緩存 | 舊代碼兼容 |
putVal():計算 hash、索引定位、鏈表/樹插入、擴容判斷、樹化/反樹化。resize():2倍擴容,重新計算索引 (JDK 8 優化:高位不變或遷移)。treeifyBin():鏈表轉紅黑樹條件 (TREEIFY_THRESHOLD=8 且 MIN_TREEIFY_CAPACITY=64)。getNode():hash 定位 → 比較 key (== 或 equals) → 鏈表/樹查找。initialCapacity,避免頻繁擴容:new HashMap<>(expectedSize * 4 / 3)。hashCode() 與 equals() 契約,不可變對象最佳。ConcurrentHashMap 或 Collections.synchronizedMap (性能差)。LinkedHashMap,需要排序/範圍查詢用 TreeMap。iterator.remove() 或收集後批量處理。