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 保证线程间的同步。
此外,Vector
和 ArrayList
的一个重要区别也是上面提到的线程安全问题,其中 Vector
是线程安全的,而 ArrayList
不是线程安全的。