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

HashMap 與 Hashtable 核心差異深度解析

     編輯:Java 相關知識

前言

在 Java 面試中,「HashMap 與 Hashtable 的差異」幾乎是必考題目。這不僅考驗候選人對集合框架的掌握程度,更能看出其對多線程併發處理的理解深度。本文將系統性梳理兩者的異同點,並延伸至現代開發中的最佳實踐。

核心差異對比

1. 線程安全與同步機制

Hashtable:所有公開方法均標註 synchronized,屬於「粗粒度鎖」,確保線程安全,但效能較低。

HashMap:非線程安全(非 synchronized),單線程環境下效能優於 Hashtable。若需多線程環境,建議使用 Collections.synchronizedMap() 包裝,或直接採用 ConcurrentHashMap(JDK 1.5+),後者採用分段鎖/CAS 機制,併發效能大幅提升。

2. Null 鍵值支援

  • HashMap:允許一個 null Key 及多個 null Value
  • Hashtable:Key 和 Value 均不允許為 null,否則拋出 NullPointerException

3. 迭代器行為差異

HashMap 的 Iterator 為 fail-fast 機制:當結構被修改(非迭代器自身的 remove())時,拋出 ConcurrentModificationException。Hashtable 的 Enumeration 不具備此機制,屬於「弱一致性」迭代。

4. 效能表現

單線程場景下,HashMap 因無同步開銷,讀寫效能顯著優於 Hashtable。多線程場景下,ConcurrentHashMap 是首選,Hashtable 已被視為過時類別。

源碼層面補充

  • Hashtable 繼承 Dictionary 抽象類,JDK 1.2 實作 Map 介面納入集合框架
  • HashMap 直接實作 Map 介面,底層採用「陣列 + 鏈表 + 紅黑樹」(JDK 1.8+)優化哈希碰撞
  • 兩者初始容量預設 11 vs 16,擴容策略不同:Hashtable 2n+1,HashMap 2n(2 的冪次)

最佳實踐建議

  1. 單線程/非共享場景:優先 HashMap
  2. 多線程高併發:首選 ConcurrentHashMap
  3. 避免直接使用 Hashtable,僅維護舊系統時接觸
  4. 若需保持插入順序,考慮 LinkedHashMap;需排序用 TreeMap

總結

HashMap 與 Hashtable 的核心分歧在於「同步策略」與「Null 支援」。現代 Java 開發中,Hashtable 已退出歷史舞台,理解其設計缺陷有助於更深入掌握 ConcurrentHashMap 的演進邏輯。面試時,能從底層實作、擴容機制、併發模型三個維度展開,將極大加分。

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