Map (I) ├─ AbstractMap // 骨架實現 │ ├─ HashMap // 拉鏈法雜湊表,非同步,允許 null │ ├─ LinkedHashMap // 繼承 HashMap,雙向鏈表保序 │ ├─ TreeMap // 紅黑樹,有序,NavigableMap │ ├─ WeakHashMap // 弱鍵引用,GC 自動清理 │ ├─ IdentityHashMap // == 比較而非 equals │ └─ EnumMap // Enum 鍵專用,位向量 ├─ Hashtable // 繼承 Dictionary,同步,不允許 null └─ ConcurrentHashMap // JUC,分段鎖/CAS,高併發
| 維度 | HashMap | Hashtable | TreeMap | WeakHashMap |
|---|---|---|---|---|
| 底層結構 | 拉鏈法雜湊表 (JDK8+ 鏈表轉紅黑樹) | 拉鏈法雜湊表 | 紅黑樹 | 拉鏈法雜湊表 (弱鍵) |
| 線程安全 | 否 | 是 (全鎖 synchronized) | 否 | 否 |
| null 鍵/值 | 允許 (1 null key) | 禁止 | 值允許,鍵禁止 | 允許 |
| 順序 | 無序 | 無序 | 有序 (自然/Comparator) | 無序 |
| 遍歷方式 | Iterator | Iterator + Enumeration | Iterator | Iterator |
| 擴容策略 | 2倍 (16→32...) | 2倍+1 (11→23...) | 無擴容 (樹增長) | 同 HashMap |
| 雜湊算法 | 擾動函數 (高位混合) | 直接 key.hashCode() | 比較器 compare() | 同 HashMap |
| 序列化 | 支援 | 支援 | 支援 | 不支援 (無 Serializable) |
| 克隆 | 支援 | 支援 | 支援 | 不支援 (無 Cloneable) |
| 核心優勢 | 單線程高效通用 | 舊代碼兼容、線程安全 | 有序、區間/導航查詢 | 鍵自動失效、緩存、監聽器 |
synchronized,吞吐極低;高併發請用 ConcurrentHashMap。hash(key.hashCode()) 將高位資訊混合到低位,減少碰撞;Hashtable 直接用 hashCode()。containsValue)。// 核心:Entry 繼承 WeakReference static class Entryextends WeakReference implements Map.Entry { V value; Entry(K k, V v, ReferenceQueue q, int h, Entry next) { super(k, q); // 註冊到 ReferenceQueue value = v; } } // 每次操作先清理隊列 private void expungeStaleEntries() { for (Entry e; (e = (Entry) queue.poll()) != null; ) { int i = indexFor(e.hash, table.length); Entry prev = table[i], curr = prev; while (curr != e) { prev = curr; curr = curr.next; } prev.next = curr.next; // 從鏈表移除 } }
Collections.synchronizedMap 或自定義。HashMap (預設 16/0.75,預估大小用構造函數)。TreeMap (或併發 ConcurrentSkipListMap)。LinkedHashMap (LRU 快取設 accessOrder=true 並覆寫 removeEldestEntry)。ConcurrentHashMap (JDK8+ CAS+synchronized 細粒度,無鎖讀)。WeakHashMap。EnumMap (極致效能、記憶體)。IdentityHashMap (序列化、圖算法)。Hashtable (新代碼禁用)。new HashMap<>((int)(expectedSize/0.75f) + 1) 避免 Rehash。hashCode/equals,高質量雜湊減少碰撞。iterator.remove() 或 computeIfAbsent 等原子操作。putAll 或並行流 (JDK8+)。Map 選型核心三問:需不需要有序?需不需要線程安全?鍵需不需要自動過期?
HashMap 通用王者,TreeMap 有序導航,ConcurrentHashMap 併發首選,WeakHashMap 自動清理神器。
Hashtable 退役,LinkedHashMap 保序利器,EnumMap/IdentityMap 專用神器。