2017-05-26 4 views
6

Nach dem Lesen source code von java.util.HashMap#resize, bin ich sehr verwirrt mit einem Teil - das ist, wenn einige bin mehr als einen Knoten hat.verwirrt über hashmap # Größe ändern

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; 
    } 
} 

Warum fühle ich diesen Teil ist nicht notwendig zu existieren? Verwenden Sie einfach den folgenden Code

newTab[e.hash & (newCap - 1)] = e; 

ist in Ordnung - ich denke, sie haben den gleichen Effekt.

Warum also so viel Code in der else-Zweig haben?

+0

@ShayHaned Huh? – Michael

+0

Danke! aber vielleicht hast du mich falsch verstanden, ich bin nicht verwirrt von 'e.hash & (newCap - 1)'. Ich bin verwirrt, warum in der else-Zweig so viele Code brauche ich denke, nur verwenden newTab [e.hash & (newCap - 1)] = e; 'könnte den gleichen Effekt haben. – zhuguowei

+0

@zhuguowei, sorry in diesem Fall, wirklich missverstanden Sie, auch den blöden Kommentar gelöscht :) – ShayHaned

Antwort

0

EDIT: Der Schwellenwert für die Strukturierung eines Bins ändert sich, wenn die Tabelle größer wird. Das macht es.

Ich habe die gesamte Datei nicht lesen, aber dies könnte einen möglichen Grund (Linie 220)

Die Verwendung und Übergänge zwischen Ebene vs Baumart seinen durch die Existenz der Unterklasse LinkedHashMap kompliziert ist. Siehe unten unter für Hook-Methoden, die beim Einfügen definiert werden, Entfernen und Zugriff, die LinkedHashMap-Internals auf zulassen, bleiben ansonsten unabhängig von diesen Mechaniken. (Dies erfordert auch , dass eine Karte Instanz auf einige Utility-Methoden übergeben werden, die neuen Knoten erstellen können.)