1、HashMap 和 Hashtable 都实现了 Map、Cloneable(可复制)、Serializable(可序列化)这三个接口。
2、HashMap 继承AbstractMap, Hashtable 继承Dictionary。
3、HashMap 在只有一个线程访问的情况下,效率高于Hashtable。
4、先有Hashtable (始于初始版本,作者:Json Bloch),后有 HashMap(始于JDK1.2,作者 Doug lea)
5、HashMap 允许将 null 作为一个 entryd的 key 或 value,而Hashtable 不允许。
6、HashMap 没有contains方法,取而代之的是 containsValue 和 containsKey。
7、HashMap 是Hashtable的轻量级实现(非线程安全的实现),Hashtable 是线程安全的,即线程同步。
8、 遍历方式的内部实现上有所不同,Hashtable、HashMap虽然都使用了 Iterator。但Hashtable还使用了Enumeration的方式 。
9、 初始容量大小和每次扩充容量大小的不同 :
1) Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。
2) HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。
10、计算hash值的方法不同
1) HashMap 首先需要根据元素的 KEY计算出一个hash值,然后再用这个hash值来计算得到最终的位置。
2) Hashtable直接使用对象的hashCode。hashCode是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。然后再使用 “除留余数“ 方法来获得最终的位置。
HashMap算法上的优缺点:
优点:
1) Hashtable在计算元素的位置时需要进行一次除法运算,而除法运算是比较耗时的。
2) HashMap为了提高计算效率,将哈希表的大小固定为了2的幂,这样在取模预算时,不需要做除法,只需要做位运算。
位运算比除法的效率要高很多。
缺点:
1) HashMap的效率虽然提高了,但是hash冲突却也增加了。因为它得出的hash值的低位相同的概率比较高,而计算位运算 为了解决这个问题,HashMap重新根据hashcode计算hash值后,又对hash值做了一些运算来打散数据。使得取得的位置 更加分散,从而减少了hash冲突。当然了,为了高效,HashMap只做了一些简单的位处理。从而不至于把使用2 的幂次 方 带来的效率提升给抵消掉。
详细的参数: https://blog.youkuaiyun.com/wangxing233/article/details/79452946