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

Java Hashtable 深度解析:原理、API 與實戰範例

     編輯:Java 相關知識

什麼是哈希表?

哈希表(Hash Table,Java 中為 Hashtable)是根據鍵的雜湊碼快速定位值的資料結構。核心思想:index = hash(key) % capacity,實現 O(1) 平均查找/插入/刪除。

核心概念

  • 容量:桶陣列長度,預設 11,自動擴容。
  • 負載因子:預設 0.75,閾值 = capacity * loadFactor,超過觸發 rehash() 擴容(約 2倍+1)。
  • 鍵:不可為 null,需正確實作 hashCode() 與 equals()。
  • 值:不可為 null。
  • 碰撞解決:鏈地址法,每個桶為 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 vs HashMap vs ConcurrentHashMap

特性HashtableHashMapConcurrentHashMap
線程安全所有方法 synchronized非線程安全分段鎖/CAS,高併發
允許 null鍵值皆不可為 null允許一個 null key、多個 null value鍵值皆不可為 null
迭代器Enumeration (fail-safe)Iterator (fail-fast)Iterator (弱一致性)
Java 版本1.0 (Legacy)1.21.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。

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