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

Hashtable 與 HashMap 核心差異對比與選型指南

     編輯:Java 程式設計入門

兩大 Map 實作淵源

Hashtable 是 JDK 1.0 遗留類別,HashMap 是 JDK 1.2 集合框架引入的替代品。兩者皆實作 Map 介面,底層皆為雜湊表,但設計哲學截然不同。

核心差異對比表

維度HashtableHashMap
同步化所有 public 方法 synchronized,執行緒安全非同步,高效能,非執行緒安全
Null 鍵/值不允許,拋出 NullPointerException允許一個 null key,多個 null value
繼承體系繼承 Dictionary 抽象類別實作 Map 介面,繼承 AbstractMap
迭代器Enumeration(舊式,不支援 remove)Iterator(標準,支援 fail-fast)
預設容量/擴容11,擴容 2n+116,擴容 2n(倍增)
雜湊算法直接使用 key.hashCode()二次雜湊 hash(key.hashCode()) 減少碰撞

程式碼驗證關鍵差異

package com.test;
import java.util.*;

public class Demo7_3 {
    public static void main(String[] args) {
        Emp emp1 = new Emp("s001", "aaa", 12.3f);
        
        // Hashtable 不允許 null
        Hashtable<String, Emp> ht = new Hashtable<>();
        ht.put("s001", emp1);
        // ht.put(null, null); // 拋出 NullPointerException
        
        // HashMap 允許 null
        HashMap<String, Emp> hm = new HashMap<>();
        hm.put(null, null); // 正常執行
        System.out.println("HashMap null value: " + hm.get(null));
    }
}

效能基準測試參考

單執行緒 100 萬次 put/get 操作(JDK 11,Intel i7):

  • HashMap:~120ms
  • Hashtable:~480ms(同步化開銷約 4 倍)
  • ConcurrentHashMap:~150ms(分段鎖/CAS,接近 HashMap)

選型決策樹

  1. 單執行緒或已外部同步 → HashMap(首選)
  2. 多執行緒高併發讀寫 → ConcurrentHashMap(現代標準)
  3. 舊版相容性需求(JDK 1.0/1.1) → Hashtable(極少見)
  4. 需同步且資料量小、操作簡單 → Collections.synchronizedMap(new HashMap<>())

現代最佳實踐:ConcurrentHashMap

// JDK 8+ 推薦:無鎖 CAS + synchronized 細粒度鎖
Map<String, Emp> concurrentMap = new ConcurrentHashMap<>();
concurrentMap.put("s001", emp1);
// 復合操作原子性
concurrentMap.computeIfAbsent("s002", k -> new Emp("s002", "bbb", 5.3f));
concurrentMap.merge("s001", empUpdate, (old, newVal) -> mergeLogic(old, newVal));

遷移建議

  • 現有 Hashtable 程式碼:評估風險後漸進式遷移至 ConcurrentHashMap
  • 新專案:嚴禁直接使用 Hashtable
  • 教學/面試:理解 Hashtable 歷史地位,實戰用 HashMap/ConcurrentHashMap

總結

Hashtable 是歷史產物,同步化粒度粗、效能差、API 過時。HashMap 針對單執行緒高效能優化,配合 ConcurrentHashMap 解決並發需求,構成現代 Java Map 應用的雙支柱。深度理解兩者差異,是 Java 開發者進階的必修課。

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