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

Java 中 Hashtable 與 HashMap 詳細差異對比

     編輯:Java 相關知識

Hashtable 核心特性

  • 實現 Map 介面,key-value 哈希表
  • key/value **均不允許 null**
  • 方法同步(線程安全),性能較差
  • 默認容量 11,擴容公式 old * 2 + 1
  • 直接使用 key.hashCode() 取模定位
  • 遍歷用 Enumeration(已過時風格)
  • 提供 elements() 返回值枚舉

HashMap 核心特性

  • 同樣實現 Map,但**非同步**(高性能)
  • **允許 null key(一個)和 null value(多個)**
  • 默認容量 16(2 的冪),擴容 old * 2
  • **擾動函數**重新計算 hash,& (n-1) 替代取模(位運算更快)
  • 遍歷用 Iterator(fail-fast 機制)
  • JDK 8+ 鏈表長度 > 8 且容量 > 64 時**轉紅黑樹**,最壞 O(log n)

六大核心差異總結表

#差異點HashtableHashMap
1線程安全同步方法非同步
2Null 支援完全不允許Key/Value 皆允許
3遍歷介面EnumerationIterator
4Hash 計算直接 hashCode 取模擾動函數 + 位運算
5默認容量/擴容11 / old*2+116 (2^n) / old*2
6額外方法elements()無

使用建議

  • 單線程/手動同步場景:首選 HashMap,性能優勢巨大
  • 多線程場景:不要用 Hashtable,改用 ConcurrentHashMap(分段鎖/CAS,高併發吞吐遠超 Hashtable)
  • 需保持插入順序:用 LinkedHashMap
  • 需有序 Key:用 TreeMap
  • Key 可被 GC 回收:用 WeakHashMap

源碼級關鍵點(面試必備)


// HashMap 擾動函數 (JDK 8)
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

// 索引計算:(n - 1) & hash  —— 位運算替代取模,要求 n 為 2 的冪
int index = (n - 1) & hash;

擾動函數將高 16 位混入低 16 位,減少哈希衝突;& (n-1) 要求容量為 2 的冪,這就是為何 HashMap 容量總是 2 的冪次方。

總結

Hashtable 是歷史遺留產物,**實務中已無使用場景**。HashMap 為單線程首選,多線程用 ConcurrentHashMap。掌握擾動函數、擴容機制、紅黑樹轉換、null 語義差異,是 Java 進階與面試的核心考點。

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