java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)

1.容量计算

容量的阈值=容量*加载因子
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)_第1张图片

2.扩容容量

扩容的容量大小会变成原来的两倍,用位移运算来加快计算的运行速率。
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)_第2张图片

3.单线程下的rehash

1.初始化长度为2,加入11时开始扩容,数组长度变为原来的两倍
2.依次加入5,9,11三个节点。
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)_第3张图片

4.多线程

多线程操作rehash形成环。
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)_第4张图片
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)_第5张图片
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)_第6张图片
java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)_第7张图片

jdk1.8为了避免上述情况将头插法变幻成了尾插法。

形成环以后,查找数据容易出现死循环。

你可能感兴趣的:(并发)