HashMap高并发下存在的问题

原文连接:https://blog.csdn.net/bjwfm2011/article/details/81076736数组

一、什么是HashMap?并发

    HashMap底层原理高并发

      HashMap是存储键值对(key-value)的集合,每一个键值对也叫作Entry,这些Entry分散存储在一个数组中,这个数组能够称为HashMap的主干。.net

二、HashMap在高并发下会产生的状况blog

  在分析高并发状况以前,须要搞清楚ReHash这个概念。(ReHash是HashMap在扩容时候的一个步骤)ci

   HashMap的容量是有限的,当通过屡次元素插入,使得HashMap达到必定的饱和度时,key映射位置发生冲突的概率会逐渐提升,这时候HashMap须要扩展它的长度,就是进行Resize。it

影响Resize的因素有两个原理

  • Capacity    HashMap的当前长度;
  • LoadFactor HashMap的负载因子,默认值是0.75f;

衡量HashMap是否进行Resize的条件:扩展

  HashMap.Size >= Capacity * LoadFactor遍历

三、HashMap的Resize具体作了哪些事情呢?HashMap不是简单的把长度扩大,而是通过了下面两个步骤:

  

  • 扩容:建立一个新的Entry空数组,长度是原数组的2倍。
  • ReHash:遍历原Entry数组,把全部的Entry从新Hash到新数组。为何要从新Hash呢?由于长度扩大之后,Hash的规则也随之改变。

Hash公式:index =  HashCode(Key) &  (Length - 1)

当原数组长度为8时,Hash运算是和111B作与运算;新数组长度为16,Hash运算是和1111B作与运算。Hash结果显然不一样。

Resize前的HashMap:

   

Resize后的HashMap:

ReHash的Java代码以下:

相关文章
相关标签/搜索