什么是hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升

2023-05-30,,

问题1:HashM安排的初始长度,为什么?

初始长度是 16,每次扩展或者是手动初始化,长度必须是 2的幂。

因为: index = HashCode(Key) & (length - 1), 如果 length是 2的 幂的话,则 length - 1就是 全是 1的二进制数,比如  16 - 1 = 1111,这样相当于是 坐落在长度为 length的hashMap上的位置只和 HashCode的后四位有关,这只要给出的HashCode算法本身分布均匀,算出的index就是分布均匀的。

  因为HashMap的key是int类型,所以最大值是2^31次方,但是查看源码,当到达 2^30次方,即

MAXIMUM_CAPACITY,之后,便不再进行扩容。

问题2:高并发情况下,为什么HashMap出现死锁

我们看到默认HashMap的初始长度是16,比较小,每一次push的时候,都会检查当前容量是否超过 预定的 threshold,如果超过,扩大HashMap容量一倍,整个表里的所有元素都需要按照新的hash算法被算一遍,这个代价较大。提到死锁,对于 HashMap来说,貌似只能和链表操作有关。

正常ReHash过程,可以看到,每个元素重新算hash值,将链表翻转(目的遍历每个bucket上的链表还是用的是头插法,时间复杂度最低),放到对应的bucket上的链表中

问题3:java8对hashMap做了什么优化?

简单说: java7中 hashMap每个桶中放置的是链表,这样当hash碰撞严重时,会导致个别位置链表长度过长,从而影响性能。

java8中,HashMap 每个桶中当链表长度超过8之后,会将链表转换成红黑树,从而提升增删改查的速度。

参考来源:http://www.mamicode.com/info-detail-2120749.html

什么是hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升的相关教程结束。

《什么是hashMap,初始长度,高并发死锁,java8 hashMap做的性能提升.doc》

下载本文的Word格式文档,以方便收藏与打印。