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

Hashtable vs HashMap 深度對比:繼承體系、線程安全、Null 支援、擴容策略與雜湊算法

     編輯:Java 程式設計入門

繼承體系差異

// Hashtable 繼承舊有 Dictionary
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable

// HashMap 繼承 AbstractMap(Collections 框架)
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

核心差異對比表

維度HashtableHashMap
線程安全所有方法 synchronized,天然安全非線程安全,需外部同步或 Collections.synchronizedMap()
Null Key/Value不允許,拋 NullPointerException允許 **一個** null key、多個 null value
迭代器Enumeration(舊)Iterator(fail-fast)
初始容量1116(必為 2 的冪)
擴容方式old * 2 + 1old * 2(保持 2 的冪)
雜湊計算直接用 key.hashCode()二次攪拌 hash(key.hashCode()),減少碰撞
JDK 版本1.0 遺留類1.2 Collections 框架核心

HashMap 同步包裝最佳實踐

Map<K,V> syncMap = Collections.synchronizedMap(new HashMap<>());

// 讀取 keySet 無需同步塊
Set<K> keys = syncMap.keySet();

// **迭代必須在同步塊中**,否則拋 ConcurrentModificationException
synchronized (syncMap) {
    for (K key : keys) {
        System.out.println(syncMap.get(key));
    }
}

HashMap 雜湊攪拌源碼解析(JDK 8 前)

static int hash(int h) {
    h ^= (h >>> 20) ^ (h >>> 12);
    return h ^ (h >>> 7) ^ (h >>> 4);
}

static int indexFor(int h, int length) {
    return h & (length - 1); // 位運算替代取模,length 必為 2 的冪
}

攪拌目標:將高位資訊混入低位,降低 hashCode() 分佈不均導致的碰撞。

選型建議

  • **單線程/非共享**:首選 HashMap,效能優。
  • **多線程共享**:
    • 低併發:Collections.synchronizedMap()
    • 高併發:ConcurrentHashMap(分段鎖/CAS,JDK 8+ 推薦)
  • **舊代碼維護**:Hashtable 僅為兼容保留,**新代碼不建議使用**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved