HashMap 和 Hashtable 之间的区别

2025 年 6 月 4 日 | 阅读 4 分钟

HashMap

HashMap 属于 Java 集合框架的一部分,位于 java.util 包中。它是一个非同步的 Map 接口实现,允许 null 键和值。HashMap 存储键值对,并利用哈希来实现 put() 和 get() 等基本操作的常数时间性能。

要记住的重要事项

  • Java HashMap 根据键存储值。
  • Java HashMap 只包含唯一的键。
  • Java HashMap 可能有一个 null 键和多个 null 值。
  • Java HashMap 是非同步的。
  • Java HashMap 不维护任何顺序。
  • Java HashMap 类的初始默认容量为 16,负载因子为 0.75。

阅读更多 Java HashMap

HashMap 示例

示例

编译并运行

输出

HashMap: {null=NullKey, 1=Apple, 2=Banana, 3=Cherry, 4=null}

Hashtable

Hashtable 也属于旧的集合类的一部分,存在于 java.util 包中。与 HashMap 不同,Hashtable 是同步的,这使其具有线程安全性,但也相对较慢。它不允许 null 键或 null 值。

要记住的重要事项

  • Hashtable 是一个列表数组。每个列表称为一个桶。桶的位置通过调用 hashcode() 方法来标识。Hashtable 根据键存储值。
  • Java Hashtable 类包含唯一的元素。
  • Java Hashtable 类不允许 null 键或值。
  • Java Hashtable 类是同步的。
  • Hashtable 类的初始默认容量为 11,而负载因子为 0.75。

阅读更多 Java Hashtable

示例

编译并运行

输出

Hashtable: {3=Rabbit, 2=Cat, 1=Dog}

HashMap vs. Hashtable

HashMapHashtable
HashMap 是非同步的。它不是线程安全的,在没有适当的同步代码的情况下不能在多个线程之间共享。Hashtable 是同步的。它是线程安全的,可以与多个线程共享。
HashMap允许一个 null 键和多个 null 值Hashtable不允许任何 null 键或值
HashMap 是JDK 1.2 中引入的新类Hashtable 是旧类
HashMap速度快Hashtable速度慢
我们可以通过调用此代码使 HashMap 同步

 

Map m = Collections.synchronizedMap(hashMap);

Hashtable 是内部同步的,无法取消同步。
HashMap 由 Iterator 遍历。Hashtable 由 Enumerator 和 Iterator 遍历。
HashMap 中的 Iterator 是快速失败的。Hashtable 中的 Enumerator不是快速失败的。
HashMap 继承了AbstractMap类。Hashtable 继承自Dictionary类。
使用 LinkedHashMap(子类)可以保留插入顺序。没有等效的子类来保留插入顺序。
属于 Java 集合框架,实现了 Map 接口。属于旧的集合类,也实现了 Map 接口。
它支持 Java 8 的 lambda 表达式和 Stream API。由于是旧类,函数式编程支持有限。
适用于非线程应用或在需要时进行外部同步。仅在需要线程安全性的遗留代码库中推荐使用。
通过使用 ConcurrentHashMap,在并发应用程序中提供更好的可伸缩性。不推荐将 Hashtable 用于高并发应用程序。
它可以使用 Java 8 引入的 compute()、merge() 和 forEach() 方法。由于是旧类,缺乏高级的 Java 8 增强功能。
它没有内置的遗留方法,如 elements() 或 keys()。它提供了 Dictionary 中的遗留方法,如 elements() 和 keys()。
由于非同步操作,内存效率高。由于同步开销,内存占用更高。

HashMap 和 Hashtable 选择题

1. 以下关于 HashMap 的说法哪个是正确的?

  1. HashMap 是同步的
  2. HashMap 允许多个 null 键
  3. HashMap 是旧类的一部分
  4. HashMap 允许一个 null 键和多个 null 值
 

答案:D)

解释: HashMap 允许一个 null 键和任意数量的 null 值。它不是同步的,并且作为集合框架的一部分在 Java 1.2 中引入。


2. 以下哪个在 Hashtable 中不允许?

  1. Null 键
  2. Null 值
  3. A 和 B 均可
  4. 具有相同值的多个条目
 

答案:C)

解释: Hashtable 不允许 null 键或 null 值。尝试插入其中任何一个都会导致 NullPointerException。


3. 哪个方法可用于同步 HashMap?

  1. Map m = new Hashtable();
  2. Map m = Collections.synchronizedMap(hashMap);
  3. makeSynchronized();
  4. synchronize();
 

答案:B)

解释: 您可以使用 Collections.synchronizedMap(Map) 来使 HashMap 同步。


4. 哪个遍历方法是快速失败的?

  1. Hashtable 中的 Enumerator
  2. Hashtable 中的 Iterator
  3. HashMap 中的 Iterator
  4. A 和 C 均可
 

答案:C)

解释: HashMap 中使用的 Iterator 是快速失败的,这意味着如果 Map 在迭代过程中被修改(除了通过迭代器本身),它将抛出 ConcurrentModificationException。Hashtable 中的 Enumerator 不是快速失败的。


5. Hashtable 继承自哪个类?

  1. Map
  2. AbstractMap
  3. 字典
  4. AbstractCollection
 

答案:C)

解释: Hashtable 是一个旧类,它继承自 Dictionary 类,而 HashMap 继承自 AbstractMap。


下一个主题Java EnumSet