注: 默认前面代码已经完全理解,且重新计算的hash全部位于同一个位置。

    void transfer(java.util.HashMap.Entry[] newTable, boolean rehash) {
        //1.扩容后的容量
        int newCapacity = newTable.length;
        //2.遍历旧table
        for (java.util.HashMap.Entry<K,V> e : table) {
            //3.当Entry不为null进入二层循环
            while(null != e) {
                //4.获取当前entry的下一个节点
                java.util.HashMap.Entry<K,V> next = e.next;
                //5.计算当前key的hash
                if (rehash) {
                    e.hash = null == e.key ? 0 : hash(e.key);
                }
                //6.根据hash计算元素存储的下标
                int i = indexFor(e.hash, newCapacity);
                //7.将新table当前位置的Entry对象复制给e的next属性,在这里完成新数组的头插法
                e.next = newTable[i];
                //8.新table的entry节点=当前的entry
                newTable[i] = e;
                //9.将e.next属性赋值给e继续循环
                e = next;
            }
        }
    }

1.java.util.HashMap.Entry<K,V> next = e.next;

2.e.next = newTable[i];

 

 

 3.newTable[i] = e;

 

 

 4.e=next

 

 5.第一轮循环结束,第二轮重复2-4完成正向遍历,反向插入,逆向插入

 

 java7 HashMap地表最强解析参考:https://blog.csdn.net/carson_ho/article/details/79373026