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

Hashtable 與 HashMap 深度比較:繼承體系、執行緒安全與 Null 處理差異

     編輯:Java 相關知識

核心差異總覽

特性HashtableHashMap
繼承/實作繼承 Dictionary 抽象類實作 Map 介面
執行緒安全**方法皆為 synchronized****非同步**,多執行緒需外部同步
Null Key不允許允許**一個** null key
Null Value不允許允許**多個** null value
迭代器Enumeration (非 fail-fast)Iterator (fail-fast)
效能同步開銷大單執行緒下較快

1. 繼承體系差異

  • Hashtable 是舊版集合框架 (java.util.Dictionary) 的具體實作,Java 2 平台才被改造實作 Map 介面。
  • HashMap 為 Java 2 集合框架核心成員,直接實作 Map,設計更現代化。

2. 同步機制與替代方案

Hashtable 所有公開方法加 synchronized,單鎖粗粒度鎖定,高併發下效能差。

HashMap 非同步,若需執行緒安全有三種選擇:

  1. Collections.synchronizedMap():包裝器模式,鎖定整個 Map。
    Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>());
  2. ConcurrentHashMap (JDK 1.5+):分段鎖 (Segment),高併發讀寫效能優異,**首選方案**。
  3. 手動同步:synchronized(map) { ... },易出錯不推薦。

3. Null 處理陷阱

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,避免上述歧義但犧牲彈性。

4. 迭代器行為

  • Hashtable 使用 Enumeration,**不支援 fail-fast**,併發修改時行為不可預期。
  • HashMap 使用 Iterator,**fail-fast**:偵測到結構性修改拋出 ConcurrentModificationException,及早發現 Bug。

選擇建議

  • **新專案預設使用 HashMap** (單執行緒) 或 ConcurrentHashMap (多執行緒)。
  • 僅維護舊版相容程式碼時考慮 Hashtable。
  • 需保證插入順序 → LinkedHashMap;需排序 → TreeMap。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved