Java面试题更新 2026-08-05

请说明 Java 中 HashMap 和 Hashtable 的主要区别,包括线程安全性、键值是否允许为 null、初始容量与扩容机制、迭代方式以及性能特点等方面。

技术原理Java

考察说明

考查对 Java 集合框架中两个相似 Map 实现的理解,重点在于线程安全、null 处理和内部机制的区别。

回答思路

  1. 【回答框架 1】线程安全性是核心区别。Hashtable 的方法使用 synchronized 修饰,是线程安全的;HashMap 非线程安全,多线程并发修改需外部同步。
  2. 【回答框架 2】null 允许性不同。HashMap 允许一个 null 键和多个 null 值;Hashtable 不允许 null 键或 null 值,否则抛出 NullPointerException,因为其使用 equals 和 hashCode 方法。
  3. 【回答框架 3】初始容量与扩容机制有差异。HashMap 默认初始容量为 16,扩容时容量变为原来的两倍;Hashtable 默认初始容量为 11,扩容时容量变为原来的两倍加一。此外,HashMap 在 JDK 8 后引入红黑树优化链表。
  4. 【回答框架 4】迭代方式不同。HashMap 的迭代器是 fail-fast,而 Hashtable 的迭代器也是 fail-fast,但 Hashtable 的 Enumeration 不是 fail-fast。
  5. 【回答框架 5】性能方面,由于 Hashtable 的同步开销,单线程环境下 HashMap 性能通常更好。Hashtable 是遗留类,新代码推荐使用 HashMap 或 ConcurrentHashMap。
  6. 【关键点 1】HashMap 非线程安全,Hashtable 线程安全但同步开销大。
  7. 【关键点 2】HashMap 允许 null 键和 null 值,Hashtable 不允许。
  8. 【关键点 3】HashMap 默认初始容量 16,Hashtable 为 11。
  9. 【关键点 4】HashMap 在 JDK 8 引入红黑树优化,Hashtable 没有。
  10. 【易错点 1】误以为 HashMap 的 null 键可以多个,实际上 null 键只能有一个。
  11. 【易错点 2】忽略 Hashtable 的线程安全是全局同步,并发性能远不如 ConcurrentHashMap。
  12. 【易错点 3】将 Hashtable 的 fail-fast 迭代器与非 fail-fast 的 Enumeration 混淆。