注: 默认前面代码已经完全理解,且重新计算的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