一、区别
-
继承的父类不用
HashMap继承自AbstractMap类,而Hashtable继承自Dictionary类。 -
线程安全不同
HashMap是线程不安全的,HashTable是线程安全的。 -
是否有同步方法
HashMap不是同步的,HashTable是同步的。 -
是否提供contains方法
HashMap把HashTable的contains方法去掉了,改成containsValue和containsKey,因为contains
方法容易让人引起误解。
HashTable则保留了contains,containsValue和containsKey三个方法,其中contains和
containsValue功能相同。 -
Key和Value是否允许null值
HashMap中,null可以作为键,但这样的键只允许有一个;可以有一个或多个键所对应的值为
null。
Hashtable中,Key和Value都不允许为null值。 -
两个遍历方式的内部实现上不同
HashMap、Hashtable、都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。 -
Hash值不同
哈希值的使用不同,HashMap重新计算Hash值,而HashTable直接使用对象的HashCode。 -
内部实现使用的数组初始化和扩容方式不同
HashMap在不指定容量的情况下的默认容量为16,而HashTable为11。HashMap要求底层数组的
容量一定为2的整数次幂,而HashTable则不要求底层数组的容量一定要为2的整数次幂。
HashMap扩容时,将容量变为原来的2倍,而HashTable扩容时,将容量变为原来的2倍加1。
二、联系
都是Map接口的实现类,都基于哈希表实现,每一个元素都是一个Key-Value对并且不能包含重复key,但可以包含重复的value。