HashTable与hashMap的区别

1.hashTable是线程安全且同步的,hashMap不是。

原因: hashTable中所有的方法都加了 synchronized,所有的线程进来都是要排队的,这也是为什么hashTable的效率不高的原因。

2.继承的父类的不同。

hashTable继承的是Dictionary,hashMap继承的是AbstractMap

3.hashTable的key和value不支持NULL,而hashMap是支持的。

当key==null时,在hashTable会报空指针异常!在hashMap中hash值会为零!

4.HashTable使用Enumeration(不常用和迭代器类似)遍历,HashMap使用的迭代器进行遍历!

5.初值和扩容方式不同

hashTable的初始长度是11,hashMap的初值是16,且负载因子都是0.75 。

hashTable的扩容是两倍+1 ,hashMap的扩容是两倍。

hashTable在构造方法里初始化,hashMap在put方法里初始化。

6.hash值与index计算方法不同。

hashMap中先进行字符串的hash运算,得出的值再与 本身的右移16位的值 进行异或运算

为啥要左移16位:因为h是int 值 ,有32位,右移16是位置使得高16位也能参与运算,防止hash值高16位常变,而低16位不变导致计算下标时,下标分布不均匀哈希冲突增加。

index的计算:hash&(length-1),这个其实等于 hash%length,就是取余,但是&方法效率更高。这个也解释了为啥hashMap的长度一定要是2的次方 。

在hashTable中直接key.hashCode()。 index的值是hash值与上0x7FFFFFF ,再与数组长度取余。(实际上也是让hash值为正数与长度取余)

posted @ 2021-05-15 17:42  xiaoqingfeng  阅读(308)  评论(0)    收藏  举报