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

Java 進階教程:Hashtable 與 HashMap 核心差異解析

     編輯:Java 相關知識

Hashtable 快速入門

java.util.Hashtable 是 JDK 1.0 遺留的鍵值映射實現,繼承自已過時的 Dictionary 類,後來實現了 Map 介面。雖然功能與 HashMap 相似,但存在關鍵差異。

核心差異對比表

特性HashtableHashMap
線程安全所有方法同步,效能較低非同步,高效能
Null 鍵/值完全禁止,拋 NullPointerException允許一個 null 鍵、多個 null 值
預設容量1116
負載因子0.750.75
繼承體系Dictionary → MapAbstractMap → Map
遍歷方式Enumeration + IteratorIterator (fail-fast)

實戰代碼驗證

Null 鍵/值測試


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<>());

現代替代方案建議

  1. 單執行緒/非共享場景:優先使用 HashMap,效能最優。
  2. 多執行緒共享場景:
    • JDK 5+:推薦 ConcurrentHashMap(分段鎖/CAS,高並發效能遠超 Hashtable)。
    • 舊版本:Collections.synchronizedMap(new HashMap())。
  3. 避免使用 Hashtable:除非維護極舊版本代碼,否則無理由選擇它。

內部實現細節(進階)

  • Hashtable 使用數組+鏈表,擴容時 newCapacity = oldCapacity * 2 + 1(質數偏好)。
  • HashMap JDK 8 引入紅黑樹優化長鏈表(閾值 8),效能更強。
  • 兩者 hashCode() 計算邏輯一致,但 Hashtable 直接對數組長度取模,HashMap 採用 (n-1) & hash 位運算(長度為 2 的冪次)。

總結

Hashtable 是「同步且拒絕 null 的舊版 HashMap」。現代 Java 開發中,請優先選擇 HashMap 或 ConcurrentHashMap,僅在讀取舊版序列化數據或極特殊遺留系統接口時才接觸 Hashtable。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved