jdk1.8对比jdk1.7优化 1.7下HashMap 多线程头插法造成链表成环问题
jdk1.7 和jdk1.8插入方式不同的变化
链表的插入方式从头插法
改成了尾插法
,简单说就是插入时,如果数组位置上已经有元素,1.7将新元素放到数组中,原始节点作为新节点的后继节点,1.8遍历链表,将元素放置到链表的最后
单线程下jdk1.7的头插法过程
1.7的扩容调用transfer代码,如下所示
void transfer(Entry[] newTable, boolean rehash) {
int newCapacity = newTable.length;
for (Entry<K,V> e : table) {
while(null != e) {
Entry<K,V> next = e.next;
if (rehash) {
e.hash = null == e.key ? 0 : hash(e.key);
}
int i = indexFor(e.hash, newCapacity);
e.next = newTable[i];
newTable[i] = e;
e = next;
}
}
}
单线程下头插法插入的结果会是这样 原始节点作为新节点的后继节点
(也就是反过来了)
多线程下头插法形成环的过程
这个过程的理解单用语言很难描述 这里找到了一个非常不错的视频
b站众多视频中有质量的一个 找到不太容易
源码的学习是困难的 可能我们一时半会儿会很懵逼(可能会懵逼一天) 但是一定一定要坚持下去 总是会理解的 还是推荐一下上面的是视频 比起看博客去理解 效果简直一个天上 一个地下 这篇感觉远远没有达到自己的预期 主要这个过程用语言太难描述 只能意会 自己在学习hashmap这个东西的时候可是遇到了太多的问题 还是希望鼓励大家一定不能放弃 就算浪费了很多时间 也还是要坚持下去