java.util.Hashtable 是 JDK 1.0 遺留的鍵值映射實現,繼承自已過時的 Dictionary 類,後來實現了 Map 介面。雖然功能與 HashMap 相似,但存在關鍵差異。
| 特性 | Hashtable | HashMap |
|---|---|---|
| 線程安全 | 所有方法同步,效能較低 | 非同步,高效能 |
| Null 鍵/值 | 完全禁止,拋 NullPointerException | 允許一個 null 鍵、多個 null 值 |
| 預設容量 | 11 | 16 |
| 負載因子 | 0.75 | 0.75 |
| 繼承體系 | Dictionary → Map | AbstractMap → Map |
| 遍歷方式 | Enumeration + Iterator | Iterator (fail-fast) |
Hashtable<String, String> ht = new Hashtable<>();
try { ht.put(null, "test"); } catch (NullPointerException e) { /* 禁止 null key */ }
try { ht.put("key", null); } catch (NullPointerException e) { /* 禁止 null value */ }
// Hashtable 內部同步
public synchronized V put(K key, V value) { ... }
public synchronized V get(Object key) { ... }
// 等效的手動同步 HashMap
Map<K, V> syncMap = Collections.synchronizedMap(new HashMap<>());
HashMap,效能最優。ConcurrentHashMap(分段鎖/CAS,高並發效能遠超 Hashtable)。Collections.synchronizedMap(new HashMap())。newCapacity = oldCapacity * 2 + 1(質數偏好)。hashCode() 計算邏輯一致,但 Hashtable 直接對數組長度取模,HashMap 採用 (n-1) & hash 位運算(長度為 2 的冪次)。Hashtable 是「同步且拒絕 null 的舊版 HashMap」。現代 Java 開發中,請優先選擇 HashMap 或 ConcurrentHashMap,僅在讀取舊版序列化數據或極特殊遺留系統接口時才接觸 Hashtable。