困惑hashmap#调整大小
问题描述:
读source codejava.util.HashMap#resize
后,我很困惑与某些部分 - 这是当一些bin
有多个节点。困惑hashmap#调整大小
else { // preserve order
Node<K,V> loHead = null, loTail = null;
Node<K,V> hiHead = null, hiTail = null;
Node<K,V> next;
do {
next = e.next;
if ((e.hash & oldCap) == 0) {
if (loTail == null)
loHead = e;
else
loTail.next = e;
loTail = e;
}
else {
if (hiTail == null)
hiHead = e;
else
hiTail.next = e;
hiTail = e;
}
} while ((e = next) != null);
if (loTail != null) {
loTail.next = null;
newTab[j] = loHead;
}
if (hiTail != null) {
hiTail.next = null;
newTab[j + oldCap] = hiHead;
}
}
为什么我觉得这部分不需要存在?只需使用下面的代码
newTab[e.hash & (newCap - 1)] = e;
是好的 - 我认为它们具有相同的效果。
那么为什么还要在else分支中有这么多的代码呢?
答
编辑: 随着表变大,treefying bin的阈值发生变化。这就是它正在做的。
我没有VS树模式是 由子类LinkedHashMap的存在复杂读取整个文件,但是,这可能是一个可能的原因(线220)
使用和转移之间滑动。请参阅下面的 以获取定义为在插入时调用的钩子方法, 删除和访问,允许LinkedHashMap内部为 ,否则保持独立于这些机制。 (这也 需要一个地图实例被传递到一些实用方法 可能创造新的节点。)
@ShayHaned咦? – Michael
谢谢!但也许你误解了我,我不会混淆'e.hash&(newCap - 1)'。我很困惑为什么在else分支需要这么多的代码,我认为只是使用'newTab [e.hash&(newCap - 1)] = e;'可能会有相同的效果。 – zhuguowei
@zhuguowei,对不起,真的没有误解你,也删除了愚蠢的评论:) – ShayHaned