1.Hashtable产生时间相对于HashMap较早,后逐渐废弃
Hashtable:@since JDK1.0
HashMap:@since 1.2
2.Hashtable既不支持Null key也不支持Null value
HashMap对象的key、value值均可为null
3.Hashtable是线程安全(因为每个方法中都加入了Synchronize关键字)
HashMap不是线程安全的(可能会产生死锁)
4.HashMap执行效率比Hashtable高
5.初始容量大小和每次扩充容量大小的不同
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。
HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍
6.计算效率
HashMap则更加关注hash的计算效率问题。在取模计算时,如果模数是2的幂,那么我们可以直接使用位运算来得到结果,
Hashtable的侧重点是哈希的结果更加均匀,使得哈希冲突减少。当哈希表的大小为素数时,简单的取模哈希的结果会更加均匀
7.计算hash值的方法不同
计算Hash的过程:为了得到元素的位置,首先需要根据元素的 KEY计算出一个hash值,
然后再用这个hash值来计算得到最终的位置
1)Hashtable直接使用对象的hashCode
(hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值)
然后再使用除留余数发来获得最终的位置。 (除法计算比较耗时)
2)HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。位运算 比除法的效率要高很多
HashMap效率提高,同时计算得出的Hash值低位相似度太大(散列不均匀),造成了Hash冲突
为了解决这个问题,并且不至于把使用2 的幂次方带来的效率提升抵消掉,进行简单的算法将低位相似度较大的数据进行打散