Map 介面,key-value 哈希表old * 2 + 1key.hashCode() 取模定位Enumeration(已過時風格)elements() 返回值枚舉Map,但**非同步**(高性能)old * 2& (n-1) 替代取模(位運算更快)Iterator(fail-fast 機制)| # | 差異點 | Hashtable | HashMap |
|---|---|---|---|
| 1 | 線程安全 | 同步方法 | 非同步 |
| 2 | Null 支援 | 完全不允許 | Key/Value 皆允許 |
| 3 | 遍歷介面 | Enumeration | Iterator |
| 4 | Hash 計算 | 直接 hashCode 取模 | 擾動函數 + 位運算 |
| 5 | 默認容量/擴容 | 11 / old*2+1 | 16 (2^n) / old*2 |
| 6 | 額外方法 | elements() | 無 |
HashMap,性能優勢巨大Hashtable,改用 ConcurrentHashMap(分段鎖/CAS,高併發吞吐遠超 Hashtable)LinkedHashMapTreeMapWeakHashMap
// 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 進階與面試的核心考點。