java map扩容机制_java中ConcurrentHashMap的扩容机制问题

JDK8中,扩容函数transfer中有如下一段代码,如果槽内的结点为链表结点,把原链表的结点按照某位的元素是否为1,划分为两个链表,分别放置在nextTab[i]和nextTab[n+i]位置上,

问题来了:代码中会将链表反序输出,但是我自己理解的是一个链表是源链表的反序,一个链表有一半是反序一半是源数组的顺序,我看别人的博客说是一个链表是反序,一个链表是源序列,这个怎样理解。还有源码这样处理的原因是啥

if (fh >= 0) {

int runBit = fh & n;

ConcurrentHashMap.Node lastRun = f;

for (ConcurrentHashMap.Node p = f.next; p != null; p = p.next) {

int b = p.hash & n;

if (b != runBit) {

runBit = b;

lastRun = p;

}

}

if (runBit == 0) {

ln = lastRun;

hn = null;

}

else {

hn = lastRun;

ln = null;

}

for (ConcurrentHashMap.Node p = f; p != lastRun; p = p.next) {

int ph = p.hash; K pk = p.key; V pv = p.val;

*if ((ph & n) == 0)*

* ln = new ConcurrentHashMap.Node(ph, pk, pv, ln);*

* else*

* hn = new ConcurrentHashMap.Node(ph, pk, pv, hn);*

}

setTabAt(nextTab, i, ln);

setTabAt(nextTab, i + n, hn);

setTabAt(tab, i, fwd);

advance = true;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值