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

Java 進階教程:HashMap 核心機制與最佳實踐全解析

     編輯:Java 相關知識

HashMap 核心特性速覽

  • 基於雜湊表實現 Map 介面
  • 允許 一個 null 鍵、多個 null 值
  • 非同步,單執行緒效能極高
  • 預設容量 16,負載因子 0.75
  • JDK 8 引入紅黑樹優化哈希衝突

關鍵 API 實戰演示

基本操作


Map<String, String> map = new HashMap<>();
map.put(null, "null鍵測試");      // 允許 null key
map.put("key", null);             // 允許 null value
map.put(null, null);              // 覆蓋前值,返回舊值
System.out.println(map.get(null)); // 讀取 null key 對應值

自訂物件作為 Key 的陷阱與規範


class MyKey {
    String name;
    MyKey(String n) { this.name = n; }
    @Override public int hashCode() { return name.hashCode(); }
    @Override public boolean equals(Object o) { ... }
    @Override public String toString() { return name; }
}

// 正確用法
Map<MyKey, String> map = new HashMap<>();
MyKey k1 = new MyKey("key1");
map.put(k1, "value1");
System.out.println(map.get(k1)); // "value1"

// 危險操作:修改 Key 內部狀態導致 hashCode 改變
k1.setName("key1-modified"); // 假設有 setter
System.out.println(map.get(k1)); // null!無法找到原 Entry

// 正確更新流程
map.remove(k1);
k1.setName("key1-modified");
map.put(k1, "newValue");

鐵律:Map 的 Key 物件一旦放入,絕不可修改其 hashCode()/equals() 依賴的欄位。建議 Key 使用不可變類(如 String、Integer、自訂不可變類)。

進階操作技巧

遍歷方式效能對比


// 方式 1:keySet 迭代(推薦單純遍歷 Key)
for (String key : map.keySet()) { ... }

// 方式 2:entrySet 迭代(推薦需同時取 Key/Value,避免二次查找)
for (Map.Entry<String, String> entry : map.entrySet()) {
    String k = entry.getKey();
    String v = entry.getValue();
}

// 方式 3:forEach (JDK 8+)
map.forEach((k, v) -> System.out.println(k + "=" + v));

安全移除與修改


// 迭代中移除:必須用 Iterator.remove()
Iterator<Map.Entry<K,V>> it = map.entrySet().iterator();
while (it.hasNext()) {
    if (condition(it.next())) it.remove();
}

// 計算模式 (JDK 8+)
map.computeIfAbsent("key", k -> expensiveCompute());
map.merge("key", "suffix", (old, v) -> old + v);

常見面試考點深度解析

考點核心答案
擴容機制容量達到 threshold (capacity * loadFactor) 時擴容 2 倍,JDK 8 低位掩碼重新分佈,高位不動或遷移
紅黑樹轉換閾值鏈表長度 ≥ 8 且容量 ≥ 64 轉紅黑樹;縮容 ≤ 6 退化鏈表
hashCode 擾動函數h ^ (h >>> 16) 讓高位參與運算,減少衝突
為何容量是 2 的冪次位運算 (n-1) & hash 替代取模,效能極高
線程不安全表現多執行緒 put 導致鏈表成環、數據丟失、CPU 100%

最佳實踐清單

  1. 預估數據量,指定初始容量:new HashMap<>(expectedSize) 避免頻繁擴容。
  2. Key 使用不可變物件,正確重寫 hashCode()/equals()。
  3. 多執行緒環境用 ConcurrentHashMap 或 Collections.synchronizedMap()。
  4. 遍歷刪除用 Iterator.remove(),JDK 8+ 用 removeIf()。
  5. 善用 computeIfAbsent/merge 簡化「查詢-計算-存入」邏輯。

總結

HashMap 是 Java 開發中使用頻率最高的集合類。深入理解其雜湊算法、擴容機制、紅黑樹優化、Key 不變性約束,能幫助你寫出高效、無 Bug 的代碼,也是面試必考的核心知識點。

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