原文连接: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的因素有两个原理
衡量HashMap是否进行Resize的条件:扩展
HashMap.Size >= Capacity * LoadFactor遍历
三、HashMap的Resize具体作了哪些事情呢?HashMap不是简单的把长度扩大,而是通过了下面两个步骤:
Hash公式:index = HashCode(Key) & (Length - 1)
当原数组长度为8时,Hash运算是和111B作与运算;新数组长度为16,Hash运算是和1111B作与运算。Hash结果显然不一样。
Resize前的HashMap:
Resize后的HashMap:
ReHash的Java代码以下: