HashMap 和 Hashtable 都是 Java 中用于存储键值对的集合类,但它们在设计理念、线程安全性和性能特性上有显著差异。以下是两者的详细对比:
核心区别总览
| 特性 | HashMap | Hashtable |
|---|---|---|
| 引入版本 | Java 1.2 | Java 1.0 (遗留类) |
| 线程安全性 | 非线程安全 | 线程安全(方法级同步) |
| Null键/值 | 允许一个null键和多个null值 | 不允许null键或null值 |
| 迭代器 | fail-fast | 非fail-fast |
| 继承体系 | 继承AbstractMap | 继承Dictionary(已过时) |
| 性能 | 更高(无同步开销) | 较低(同步开销) |
| 扩容机制 | 2倍增长 | 2倍+1增长 |
| 推荐使用场景 | 单线程环境或需要更高性能 | 遗留系统或必须同步的场景 |
一、线程安全性差异
HashMap (非线程安全)
// 典型的多线程问题场景
Map<String, Integer> map = new HashMap<>();
// 多线程并发put可能导致死循环(JDK8前)或数据丢失
Hashtable (线程安全)
Map<String, Integer> table = new Hashtable<>();
// 所有public方法都用synchronized修饰,如:
public synchronized V put(K key, V value) {
... }
注意:虽然Hashtable是线程安全的,但由于其粗粒度的同步方式,在并发环境下通常推荐使用:
ConcurrentHashMap(Java 5+)Collections.synchronizedMap()包装的HashMap
二、Null值处理差异
HashMap示例
HashMap<String, String> map = new HashMap<>();
map.put(null, "空



被折叠的 条评论
为什么被折叠?



