哈希表(Hash Table,Java 中為 Hashtable)是根據鍵的雜湊碼快速定位值的資料結構。核心思想:index = hash(key) % capacity,實現 O(1) 平均查找/插入/刪除。
rehash() 擴容(約 2倍+1)。hashCode() 與 equals()。Entry<K,V> 鏈表頭。Hashtable() // 容量 11, loadFactor 0.75
Hashtable(int initialCapacity)
Hashtable(int initialCapacity, float loadFactor)
Hashtable(Map<? extends K, ? extends V> t) // 複製現有 Map
| 方法 | 說明 | 回傳 |
|---|---|---|
put(K, V) | 放入鍵值對,鍵/值不可為 null | 舊值或 null |
get(Object key) | 取得值 | 值或 null |
remove(Object key) | 移除鍵值對 | 被移除的值 |
containsKey(Object) / containsValue(Object) | 檢查鍵/值是否存在 | boolean |
size() / isEmpty() | 大小判斷 | int / boolean |
clear() | 清空 | void |
keys() / elements() | Enumeration 介面遍歷鍵/值(舊式) | Enumeration |
keySet() / values() / entrySet() | Collection 視圖(較新) | Set / Collection |
Hashtable table = new Hashtable<>();
table.put("one", 1);
table.put("two", 2);
table.put("pi", 3.14);
// 方式 1:keySet + get (推薦)
for (String key : table.keySet()) {
System.out.println(key + " = " + table.get(key));
}
// 方式 2:entrySet (單次查找,效能略優)
for (Map.Entry entry : table.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
// 方式 3:Enumeration (舊代碼相容)
for (Enumeration e = table.keys(); e.hasMoreElements(); ) {
String k = e.nextElement();
System.out.println(k + " = " + table.get(k));
}
| 特性 | Hashtable | HashMap | ConcurrentHashMap |
|---|---|---|---|
| 線程安全 | 所有方法 synchronized | 非線程安全 | 分段鎖/CAS,高併發 |
| 允許 null | 鍵值皆不可為 null | 允許一個 null key、多個 null value | 鍵值皆不可為 null |
| 迭代器 | Enumeration (fail-safe) | Iterator (fail-fast) | Iterator (弱一致性) |
| Java 版本 | 1.0 (Legacy) | 1.2 | 1.5 |
| 建議:新代碼優先用 HashMap (單執行緒) 或 ConcurrentHashMap (多執行緒),Hashtable 僅維護舊系統。 | |||
public static void wordFrequency(String text) {
Hashtable freq = new Hashtable<>();
for (String word : text.toLowerCase().split("\\W+")) {
if (word.isEmpty()) continue;
freq.put(word, freq.getOrDefault(word, 0) + 1); // Java 8+
}
// 排序輸出前 10
freq.entrySet().stream()
.sorted(Map.Entry.comparingByValue().reversed())
.limit(10)
.forEach(e -> System.out.println(e.getKey() + ": " + e.getValue()));
}
Hashtable 是 Java 早期提供的線程安全映射表,雖然已被 ConcurrentHashMap 取代,但理解其同步機制、擴容邏輯與 Enumeration 遍歷,對閱讀舊代碼、面試基礎題仍有價值。現代開發請根據併發需求選擇 HashMap 或 ConcurrentHashMap。