// Hashtable 繼承舊有 Dictionary
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
// HashMap 繼承 AbstractMap(Collections 框架)
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
| 維度 | Hashtable | HashMap |
|---|---|---|
| 線程安全 | 所有方法 synchronized,天然安全 | 非線程安全,需外部同步或 Collections.synchronizedMap() |
| Null Key/Value | 不允許,拋 NullPointerException | 允許 **一個** null key、多個 null value |
| 迭代器 | Enumeration(舊) | Iterator(fail-fast) |
| 初始容量 | 11 | 16(必為 2 的冪) |
| 擴容方式 | old * 2 + 1 | old * 2(保持 2 的冪) |
| 雜湊計算 | 直接用 key.hashCode() | 二次攪拌 hash(key.hashCode()),減少碰撞 |
| JDK 版本 | 1.0 遺留類 | 1.2 Collections 框架核心 |
Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>());
// 讀取 keySet 無需同步塊
Set<K> keys = syncMap.keySet();
// **迭代必須在同步塊中**,否則拋 ConcurrentModificationException
synchronized (syncMap) {
for (K key : keys) {
System.out.println(syncMap.get(key));
}
}
static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
static int indexFor(int h, int length) {
return h & (length - 1); // 位運算替代取模,length 必為 2 的冪
}
攪拌目標:將高位資訊混入低位,降低 hashCode() 分佈不均導致的碰撞。
HashMap,效能優。Collections.synchronizedMap()ConcurrentHashMap(分段鎖/CAS,JDK 8+ 推薦)Hashtable 僅為兼容保留,**新代碼不建議使用**。