(1)线程安全性:这是两者最主要的区别,Hashtable是线程安全,而HashMap则非线程安全。Hashtable的实现方法里面都添加了synchronized关键字来确保线程同步,因此相对而言HashMap性能会高一些。
(2)计算hash值的方式:HashMap中元素的hash值是重新计算过的,以便获得更好的散列值,Hashtable直接使用Object的hashcode
(3)数据结构:在JDK1.8之前,HashMap和Hashtable的数据结构都可以看成“数组+链表”;在JDK1.8之后,HashMap的数组结构变成了“数组+链表+红黑树”
(4)两者均实现了Map接口,但是HashMap继承了AbstractMap,HashTable继承Dictionary抽象类
(5)HashMap允许null值和null键(只允许一个),HashMap以null作为key时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key。
(6)HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75。扩容时,HashMap的容量变成原来的2倍,Hashtable的容量变为2倍+1
(7)Hashtable实现了Enumeration接口,所以可以使用Enumeration进行遍历元素
(8)判断是否含有某个键 :HashMap去掉了Hashtable中的contains()方法
在HashMap 中,null 可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null 值时,既可以表示HashMap 中没有该键,也可以表示该键所对应的值为null。因此,在HashMap 中不能用get()方法来判断HashMap 中是否存在某个键,而应该用containsKey()方法来判断。
Hashtable 的键值都不能为null,所以可以用get()方法来判断是否含有某个键。
四、HashMap和HashSet的区别: