高并发下的HashMap(转载:程序员小灰)
这一期我们来讲解高并发环境下,HashMap可能出现的致命问题。 HashMap的容量是有限的。当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高。 这时候,HashMap需要扩展它的长度,也就是进行 Resize 。 影响发生Resize的因素有两个: 1.Capacity HashMap的当前长度。上一期曾经说过,HashMap的长度是2的幂。 2.LoadFactor HashMap负载因子,默认值为0.75f。 衡量HashMap是否进行Resize的条件如下: HashMap.Size >= Capacity * L oadFactor 1.扩容 创建一个新的Entry空数组,长度是原数组的2倍。 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代码如下: /** * Transfers all