困惑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分支中有这么多的代码呢?

+0

@ShayHaned咦? – Michael

+0

谢谢!但也许你误解了我,我不会混淆'e.hash&(newCap - 1)'。我很困惑为什么在else分支需要这么多的代码,我认为只是使用'newTab [e.hash&(newCap - 1)] = e;'可能会有相同的效果。 – zhuguowei

+0

@zhuguowei,对不起,真的没有误解你,也删除了愚蠢的评论:) – ShayHaned

编辑: 随着表变大,treefying bin的阈值发生变化。这就是它正在做的。

我没有VS树模式是 由子类LinkedHashMap的存在复杂读取整个文件,但是,这可能是一个可能的原因(线220)

使用和转移之间滑动。请参阅下面的 以获取定义为在插入时调用的钩子方法, 删除和访问,允许LinkedHashMap内部为 ,否则保持独立于这些机制。 (这也 需要一个地图实例被传递到一些实用方法 可能创造新的节点。)