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 取代。