HashMap<K,V> 是 Java 集合框架中使用率最高的鍵值對容器,基於雜湊表實現,提供 O(1) 平均時間複雜度的插入、查詢、刪除操作。JDK 8 引入紅黑樹優化,極大提升高碰撞場景效能。
| 特性 | 說明 |
|---|---|
| 允許 null 鍵/值 | 最多一個 null key,多個 null value |
| 非同步 | 多執行緒需自行同步或用 ConcurrentHashMap |
| 無序 | 不保證迭代順序,順序可能隨操作變化 |
| 預設容量 16 | 負載因子 0.75,擴容門檻 = capacity * loadFactor |
| JDK 8 樹化 | 桶位節點 ≥ 8 且容量 ≥ 64 時轉紅黑樹 |
package com.test;
import java.util.*;
public class Demo7_3 {
public static void main(String[] args) {
// 建立員工物件
Emp emp1 = new Emp("s001", "aaa", 12.3f);
Emp emp2 = new Emp("s002", "bbb", 5.3f);
Emp emp3 = new Emp("s003", "李逵", 52f);
// 建議指定初始容量減少擴容
HashMap<String, Emp> hm = new HashMap<>(16);
hm.put("s001", emp1);
hm.put("s002", emp2);
// hm.put("s002", emp3); // 相同 key 會覆蓋舊值
hm.put("s003", emp3);
// 安全查詢模式
String key = "s002";
if (hm.containsKey(key)) {
Emp emp = hm.get(key);
System.out.println("員工姓名:" + emp.getName());
} else {
System.out.println("查無此員工");
}
// 高效遍歷:entrySet 避免二次查詢
for (Map.Entry<String, Emp> entry : hm.entrySet()) {
System.out.println("編號:" + entry.getKey() + " 姓名:" + entry.getValue().getName());
}
}
}
class Emp {
private String empNo, name;
private float sal;
public Emp(String empNo, String name, float sal) {
this.empNo = empNo; this.name = name; this.sal = sal;
}
public String getName() { return name; }
public float getSal() { return sal; }
}
// 簡化版樹化邏輯(Node.java)
static final int TREEIFY_THRESHOLD = 8;
static final int MIN_TREEIFY_CAPACITY = 64;
void treeifyBin(Node<K,V>[] tab, int hash) {
if (tab.length < MIN_TREEIFY_CAPACITY) {
resize(); // 優先擴容而非樹化
} else {
// 將鏈表轉為紅黑樹
}
}
解決惡意造碰撞攻擊(HashDoS)與極端資料分佈導致的效能退化,將最壞情況從 O(n) 降為 O(log n)。
new HashMap<>(expectedSize * 4 / 3 + 1) 避免頻繁擴容keySet() + get() 雙重查詢Collections.synchronizedMapHashMap 是 Java 開發者的核心工具,理解其雜湊桶+鏈表/紅黑樹結構、擴容機制、JDK 8 樹化優化,能寫出高效、穩健的程式碼。記住:預設容量、entrySet 遍歷、不可變 Key、並發用 ConcurrentHashMap 是四大黃金法則。