page contents

ConcurrentHashMap一个节点发生多次扩容时,高低链的问题

Pack 发布于 2020-01-14 09:06
阅读 486
收藏 0
分类:Java开发

attachments-2020-01-1nnYNyXA5e1d1410c3d5a.jpg

如果一个索引位置出现多次碰撞,是这样一个形态吗?感觉好像这块理解的有点问题

根据这个计算公式,(f = tabAt(tab, i = (n - 1) & hash) 绿色的下标好像就发生变化了。

假设hash值为32433434。
15 & 32433434 = 10
31 & 32433434 = 26
63 & 32433434 = 26

计算出来的下标就不对了。

好像这个+16的跨度只会出现在 15~31第一次扩容的时候。

setTabAt(nextTab, i, ln);
setTabAt(nextTab, i + n, hn);

那如上图,14下标节点第二次扩容,这时数组长度为32,新数组长度为64,这时14下标位置链表高位链 14 + 32 = 46下标的位置,那么根据(f = tabAt(tab, i = (n - 1) & hash)。获得的位置63 & hash 位置就得不到46这个位置了

182
Pack
Pack

这个问题,我一直没回答你,你不能用静态思维去思考动态的问题呀。

在16位长度扩容到32位, 通过高低位做迁移。

从32位到64位,做高低位迁移, 是增加32哦, 同学,这个怎么就想不通呢!


15 & 52 =4

31 & 52 =20

53 & 52 = 52


4-20 =16

20 -52=32

请先 登录 后评论