在 Java 面試中,「HashMap 與 Hashtable 的差異」幾乎是必考題目。這不僅考驗候選人對集合框架的掌握程度,更能看出其對多線程併發處理的理解深度。本文將系統性梳理兩者的異同點,並延伸至現代開發中的最佳實踐。
Hashtable:所有公開方法均標註 synchronized,屬於「粗粒度鎖」,確保線程安全,但效能較低。
HashMap:非線程安全(非 synchronized),單線程環境下效能優於 Hashtable。若需多線程環境,建議使用 Collections.synchronizedMap() 包裝,或直接採用 ConcurrentHashMap(JDK 1.5+),後者採用分段鎖/CAS 機制,併發效能大幅提升。
null Key 及多個 null Valuenull,否則拋出 NullPointerExceptionHashMap 的 Iterator 為 fail-fast 機制:當結構被修改(非迭代器自身的 remove())時,拋出 ConcurrentModificationException。Hashtable 的 Enumeration 不具備此機制,屬於「弱一致性」迭代。
單線程場景下,HashMap 因無同步開銷,讀寫效能顯著優於 Hashtable。多線程場景下,ConcurrentHashMap 是首選,Hashtable 已被視為過時類別。
Dictionary 抽象類,JDK 1.2 實作 Map 介面納入集合框架Map 介面,底層採用「陣列 + 鏈表 + 紅黑樹」(JDK 1.8+)優化哈希碰撞2n+1,HashMap 2n(2 的冪次)HashMap 與 Hashtable 的核心分歧在於「同步策略」與「Null 支援」。現代 Java 開發中,Hashtable 已退出歷史舞台,理解其設計缺陷有助於更深入掌握 ConcurrentHashMap 的演進邏輯。面試時,能從底層實作、擴容機制、併發模型三個維度展開,將極大加分。