2017-05-26 4 views
6

source codejava.util.HashMap#resizeを読んだ後、私はいくつかの部分と非常に混同しています。つまり、binに複数のノードがある場合です。ハッシュマップについての混乱#resize

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; 

は、私も同じ効果があると思います。

なぜ、他のブランチに非常に多くのコードがあるのでしょうか?

+0

@ShayHanedえっ? – Michael

+0

ありがとう!しかし、あなたは私を誤解したかもしれません、私は 'e.hash&(newCap - 1)'と混同しません。私は、なぜelseブランチで、 'newTab [e.hash&(newCap - 1)] = e;'を使うのが同じような効果があるのだろうと思っているのか混乱しています。 – zhuguowei

+0

@ zhuguowei、その場合はごめんなさい、本当にあなたを誤解した、また愚かなコメントを削除しました:) – ShayHaned

答えて

0

EDIT: ビンをツリー化するためのしきい値は、テーブルが大きくなるにつれて変化します。それが何をしているのですか?

私は、ファイル全体を読んでいないが、これは可能な理由(ライン220)

ツリーモードVS平野の中で使用して遷移がサブクラスのLinkedHashMapの存在によって複雑 である可能性があります。挿入時に呼び出されるように定義されたフックメソッドについては、 を参照してください。 LinkedHashMap内部を にすることができない場合は、これらの機構から独立しています。 (これも マップ・インスタンスが新しいノードを作成することができ、いくつかのユーティリティメソッド に渡されている必要があります。)

関連する問題