| 特性 | Hashtable | HashMap |
|---|---|---|
| 繼承/實作 | 繼承 Dictionary 抽象類 | 實作 Map 介面 |
| 執行緒安全 | **方法皆為 synchronized** | **非同步**,多執行緒需外部同步 |
| Null Key | 不允許 | 允許**一個** null key |
| Null Value | 不允許 | 允許**多個** null value |
| 迭代器 | Enumeration (非 fail-fast) | Iterator (fail-fast) |
| 效能 | 同步開銷大 | 單執行緒下較快 |
Hashtable 是舊版集合框架 (java.util.Dictionary) 的具體實作,Java 2 平台才被改造實作 Map 介面。HashMap 為 Java 2 集合框架核心成員,直接實作 Map,設計更現代化。Hashtable 所有公開方法加 synchronized,單鎖粗粒度鎖定,高併發下效能差。
HashMap 非同步,若需執行緒安全有三種選擇:
Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>());synchronized(map) { ... },易出錯不推薦。Map<String, String> map = new HashMap<>();
map.put(null, "value"); // 合法,唯一 null key
map.put("key", null); // 合法
map.put("key2", null); // 合法,多個 null value
String v = map.get("key"); // 回傳 null → 無法區分「key 不存在」vs「value 為 null」
// 正確判斷鍵是否存在:
boolean exists = map.containsKey("key");
Hashtable 直接拋出 NullPointerException 禁止 null key/value,避免上述歧義但犧牲彈性。
Hashtable 使用 Enumeration,**不支援 fail-fast**,併發修改時行為不可預期。HashMap 使用 Iterator,**fail-fast**:偵測到結構性修改拋出 ConcurrentModificationException,及早發現 Bug。HashMap** (單執行緒) 或 ConcurrentHashMap (多執行緒)。Hashtable。LinkedHashMap;需排序 → TreeMap。