jdk1.8对比jdk1.7优化 1.7下HashMap 多线程头插法造成链表成环问题

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这个东西的时候可是遇到了太多的问题 还是希望鼓励大家一定不能放弃 就算浪费了很多时间 也还是要坚持下去

发布了39 篇原创文章 · 获赞 19 · 访问量 1481

猜你喜欢

转载自blog.csdn.net/weixin_44222272/article/details/105129434