HashMap 和 HashTable 有什么区别?
推荐答案
HashMap 和 HashTable 有什么区别?
总结性回答:
HashMap 和 HashTable 都是基于哈希表实现的键值对存储结构,主要区别在于线程安全性、性能、null 值处理和迭代器特性。HashMap 是非线程安全的,性能更好,允许 null 键和 null 值;而 HashTable 是线程安全的,性能稍差,不允许 null 键或 null 值。
详细区别
1. 线程安全性
- HashMap:非线程安全,多线程环境下需要额外同步措施(如使用
Collections.synchronizedMap()
或ConcurrentHashMap
)。 - HashTable:线程安全,所有方法都用
synchronized
修饰,但会导致性能下降。
2. 性能
- HashMap:由于没有同步开销,性能更好。
- HashTable:同步操作带来性能损耗,在高并发场景下可能成为瓶颈。
3. null 处理
- HashMap:允许一个 null 键和多个 null 值。
- HashTable:不允许 null 键或 null 值,否则会抛出
NullPointerException
。
4. 迭代器特性
- HashMap:使用
Iterator
是快速失败(fail-fast)的,迭代过程中修改会抛出ConcurrentModificationException
。 - HashTable:迭代器不是快速失败的(但实际实现中也是 fail-fast 的)。
5. 继承关系
- HashMap:继承自
AbstractMap
类。 - HashTable:继承自
Dictionary
类(这是一个过时的类)。
6. 初始容量和扩容
- HashMap:默认初始容量 16,扩容时容量变为原来的 2 倍。
- HashTable:默认初始容量 11,扩容时容量变为原来的 2 倍加 1。
使用建议
- 在不需要线程安全的场景下,优先使用 HashMap(性能更好)。
- 需要线程安全时,推荐使用
ConcurrentHashMap
而非 HashTable(ConcurrentHashMap
性能更好)。 - HashTable 是 Java 早期版本提供的类,现在基本被
ConcurrentHashMap
取代。