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不是线程安全的。