大多数人不知道的:HashMap链表成环的原因和解决方案

  • Post author:
  • Post category:其他




前言:

在 JDK7 版本下,很多人都知道 HashMap 会有链表成环的问题,但大多数人只知道,是多线程引起的,至于具体细节的原因,和 JDK8 中如何解决这个问题,很少有人说的清楚,百度也几乎看不懂,本文就和大家聊清楚两个问题:

  1. JDK7 中 HashMap 成环原因;
  2. JDK8 中是如何解决的。



一、JDK7 中 HashMap 成环原因


成环的时机

  1. HashMap 扩容时。
  2. 多线程环境下。


成环的具体代码位置

在扩容的 transfer 方法里面,有三行关键的代码,如下:

 void transfer(Entry[] newTable, boolean rehash) {
   
        int newCapacity = newTable.length;
        for (Entry<K,V> e : table) {
   
            //e为空时循环结束
            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



版权声明:本文为m0_45270667原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。