HashMap 和 Hashtable 都實現了 Map 接口,用於存儲鍵值對,但它們在線程安全性、空值處理、性能及繼承體系上存在顯著差異。理解這些差異有助於選擇合適的集合類。
| 特性 | HashMap | Hashtable |
|---|---|---|
| 線程安全 | 非線程安全(高性能) | 線程安全(方法同步,性能較低) |
| 允許 Null 鍵/值 | 允許一個 Null Key,多個 Null Value | 不允許 Null Key 或 Null Value(拋出 NullPointerException) |
| 繼承體系 | Java 1.2 引入,實現 Map 接口 | 繼承自舊有的 Dictionary 類 |
| 迭代器 | Fail-fast(快速失效) | Enumerator(非 fail-fast) |
| 同步機制 | 需外部手動同步或用 Collections.synchronizedMap() 包裝 |
內部方法均加 synchronized |
| 性能 | 單線程環境下性能優於 Hashtable | 同步開銷大,性能較低 |
| contains 方法 | 已移除,改為 containsKey() 和 containsValue() |
保留 contains()、containsKey()、containsValue() |
HashMap,性能更好,API 更現代。ConcurrentHashMap(JDK 1.5+),它提供分段鎖機制,並發性能遠優於 Hashtable 的全表鎖。兩者底層的哈希/再哈希算法大體相同,因此單線程下的基本操作時間複雜度均為 O(1)。主要性能差異源於同步機制的有無。