HashMap实现原理:容量、负载因子、hash与定位都搞定了吗?( 九 )
即 , 当超过限制的时候会resize , 又因为我们使用的是2次幂的扩展 , 所以 , 元素的位置要么是在原位置 , 要么是在原位置再移动2次幂的位置 。
怎么理解呢?例如我们从16扩展为32时 , 具体的变化如下:
假设bucket大小n=2^k , 元素在重新计算hash之后 , 因为n变为2倍那么新的位置就是(2^(k+1)-1)&hash 。 而2^(k+1)-1=2^k+2^k-1 , 相当于2^k-1的mask范围在高位多1bit(红色)(再次提醒 , 原来的长度n也是2的次幂) , 这1bit非1即0 。 如图:
所以 , 我们在resize的时候 , 不需要重新定位 , 只需要看看原来的hash值在新增bit的位置上是1还是0就好了 , 是0的话位置没变 , 是1的话位置变成“原位置+oldCap” 。 代码比较长就不贴了 , 下面为16扩充为32的resize示意图:
这个设计非常的巧妙 , 如果认为hash值是随机的 , 那么新增的1bit是0还是1也是随机的 , 因此resize的过程随机的把之前的冲突的节点分散到新的bucket中了 。
推荐阅读
- 左慈|三国杀:技能缝接,超强发挥,用左慈就能实现
- 商人|游戏商人的月入百万是真的吗?揭秘真实的剑三游戏商人真实现状
- fly|从电竞迈向艺术:Fly选手实现人生跨越,成历史第一人!
- 赤色要塞|玩经典游戏《赤色要塞》魔改版:吉普车也能用激光炮,童年梦想实现了
- 手机游戏|梦幻西游手游:封系统治擂台?浅谈经脉学问,方寸也能实现双封!
- 魂斗罗|“为什么魂斗罗内存这么少,却可以实现那么长的剧情?”
- rw战队|KPL前瞻:Hero对阵RW侠首发公布,黑鲸的Flag真有可能实现
- 单机|《仙剑奇侠传七》逆风翻盘!蒙尘的老牌IP,终于实现了自我救赎
- LGD|Ti10:LGD实现逆天翻盘锁定总决赛,虎牙Sccc激动到泪目
- 美好世界|“我们的工作只是实现人类的愿望,而不是创造一个我们认为的《美好世界》”