Java 中 Hashtable 与 HashMap 的区别

据说这是面试中被问频率非常高的一个问题,下面做简单的记录:

相同点

  • 父类都是 Map 类
  • 都是用来存储 kv 对的
  • 存取 kv 的方法名一样(前提是均使用 iterator 来遍历)

不同点

线程安全

Hashtable 是线程安全的,HashMap 不是线程安全的。什么是线程安全?简单就是在多线程的情况下变量的值能否正确地被每个线程修改。因为多线程同时修改的时候有可能发生冲突,如同时修改一个变量等操作。

所以在多线程的情况下,要使用 Hashtable。

效率

Hashtable 的效率比 HashMap 的效率要低。表现为相同的数据下 HashMap 比 Hashtable 使用的内存更多而且更慢。这个可以算是线程安全所付出的代价,因为要保证线程间的同步,需要额外的维护变量不能同时被修改。

所以单线程的时候,建议使用 HashMap,效率较高

遍历的方法

两者均可通过 java.util.Iterator 来遍历,除此之外 Hashtable 还可以通过 java.util.Enumeration 来遍历。关于两者的区别可以看这篇文章

空键值

Hashtable 不允许 null 的键值,HashMap 则允许一个 null 键和若干 null 的 value。

使用建议

单线程的情况下使用 HashMap,效率较高,多线程的情况下使用 Hashtable 保证线程间的同步。

此外,VectorArrayList 的一个重要区别也是上面提到的线程安全问题,其中 Vector 是线程安全的,而 ArrayList 不是线程安全的。