Java 面试题
目录

Java 中 HashMap 和 HashTable 的区别是什么?

· 约 3 分钟读完 · 第 17 / 274 章

推荐答案

  1. 线程安全性:

    • Hashtable 是线程安全的,所有方法都是同步的。
    • HashMap 不是线程安全的,但可以通过 Collections.synchronizedMap 方法将其转换为线程安全的。
  2. 性能:

    • Hashtable 由于同步操作,性能较低。
    • HashMap 没有同步操作,性能较高。
  3. null 键和值:

    • Hashtable 不允许键或值为 null。
    • HashMap 允许键和值都为 null。
  4. 继承关系:

    • Hashtable 继承自 Dictionary 类。
    • HashMap 继承自 AbstractMap 类。
  5. 迭代器:

    • Hashtable 使用 Enumeration 进行遍历。
    • HashMap 使用 Iterator 进行遍历。

本题详细解读

线程安全性

Hashtable 是线程安全的,因为它的所有方法都是同步的。这意味着在多线程环境下,Hashtable 可以保证数据的一致性。然而,这种同步机制也导致了性能上的损失。

HashMap 不是线程安全的,因此在多线程环境下使用 HashMap 可能会导致数据不一致的问题。不过,可以通过 Collections.synchronizedMap 方法将 HashMap 转换为线程安全的 Map。

性能

由于 Hashtable 的所有方法都是同步的,因此在单线程环境下,Hashtable 的性能通常低于 HashMap。HashMap 没有同步操作,因此在单线程环境下性能更高。

null 键和值

Hashtable 不允许键或值为 null,如果尝试插入 null 键或值,会抛出 NullPointerException。而 HashMap 允许键和值都为 null,这使得 HashMap 在处理某些特殊情况时更加灵活。

继承关系

Hashtable 继承自 Dictionary 类,而 HashMap 继承自 AbstractMap 类。Dictionary 是一个抽象类,而 AbstractMap 是一个实现了 Map 接口的抽象类。这种继承关系使得 HashMap 在设计上更加现代化。

迭代器

Hashtable 使用 Enumeration 进行遍历,而 HashMap 使用 Iterator 进行遍历。Iterator 比 Enumeration 更加强大,支持在遍历过程中删除元素,而 Enumeration 不支持删除操作。

通过以上对比,可以看出 HashMap 在大多数情况下是更好的选择,尤其是在单线程环境下。如果需要线程安全的 Map,可以考虑使用 ConcurrentHashMap,它在性能和线程安全性之间提供了更好的平衡。