Map 存儲鍵值對,每個鍵映射單一值。核心方法分四類:
| 類別 | 方法 | 說明 |
|---|---|---|
| 物件相等 | equals(Object) | 比較 Map 內容等價性 |
| hashCode() | 返回 Map 雜湊碼 | |
| 構建修改 | put(K,V) | 關聯鍵值,返回舊值 |
| putAll(Map) | 批量導入 | |
| remove(Object key) | 移除鍵值對 | |
| clear() | 清空 | |
| 查詢訪問 | get(Object key) | 取值,無則 null |
| containsKey/Value | 鍵/值存在性 | |
| size() / isEmpty() | 大小與空判斷 | |
| 視圖迭代 | entrySet() | Set |
| keySet() | Set 鍵視圖 | |
| values() | Collection 值視圖 |
// 方式一:Iterator(推薦,無中間物件)
for (Map.Entry e : map.entrySet()) { ... }
// 方式二:toArray() 轉陣列再迭代
Object[] arr = map.entrySet().toArray();
for (Object o : arr) { ... }
toArray() 開銷:Iterator 快 10-20%| 實現 | 特性 | 適用場景 | 線程安全 |
|---|---|---|---|
| HashMap | 雜湊表、無序、允許 null 鍵值 | 通用高頻讀寫 | 否 |
| LinkedHashMap | 雙向鏈表維護插入/訪問序 | LRU 快取、需預測迭代序 | 否 |
| TreeMap | 紅黑樹、鍵自然序/Comparator 序 | 範圍查詢、有序遍歷 | 否 |
| Hashtable | 舊版、同步方法、不允許 null | 遺留代碼維護 | 是(粗粒度鎖) |
| ConcurrentHashMap | CAS + synchronized 分段/節點鎖 | 高併發讀寫 | 是(細粒度) |
| WeakHashMap | 鍵為弱引用、GC 可回收 | 元資料快取、監聽器註冊 | 否 |
| IdentityHashMap | == 比較鍵而非 equals() | 物件身份映射、序列化圖 | 否 |
| Properties | 鍵值皆 String、支援載入/存儲 | 配置檔 | 是(繼承 Hashtable) |
// 簡化版雜湊函數
int hash = key.hashCode();
hash ^= (hash >>> 16); // 擾動:高位參與低位運算
int index = (table.length - 1) & hash; // 2^n 長度取模等價位運算
new HashMap<>(expectedSize) 避免多次擴容containsKey() O(1);containsValue() O(n) 全掃描。若頻繁按值查詢,維護雙向 Map(值→鍵)或用 Map 反向索引。
java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaultsAbstractMap,實作 entrySet() 即可ConcurrentHashMap,避免 Collections.synchronizedMap() 全鎖LinkedHashMap;需排序用 TreeMapWeakHashMap + 軟引用值,或直接用 Caffeine/Guava Cachenew HashMap<>((int)(n/0.75)+1)ConcurrentModificationException),需修改用 Iterator.remove() 或 ConcurrentHashMapMap 是 Java 集合框架的基石。理解雜湊分佈、負載因子、樹化閾值、視圖機制、線程安全模型,能讓你在面對海量資料、高併發、有序需求、記憶體敏感等場景時,精準選型並寫出高效穩健的代碼。