2017-05-26 21 views
6

Po przeczytaniu source code z java.util.HashMap#resize, jestem bardzo zdezorientowany z pewną częścią - to jest, gdy niektóre bin ma więcej niż jeden węzeł.mylić o hashmap # 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; 
    } 
} 

Dlaczego czuję, że ta część nie ma potrzeby istnienia? Wystarczy użyć kodu poniżej:

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

jest ok - Myślę, że mają ten sam efekt.

Po co więc zawracać sobie głowę tak wieloma kodami w innej gałęzi?

+0

@ShayHaned Huh? – Michael

+0

Dzięki! ale może mnie źle zrozumiałeś, nie jestem mylony z 'e.hash i (newCap-1)'. Jestem zdezorientowany, dlaczego w innej gałęzi potrzeba tak wielu kodów, myślę, że po prostu użyję 'newTab [e.hash i (newCap - 1)] = e;' może mieć taki sam efekt. – zhuguowei

+0

@zhuguowei, przykro mi w tym przypadku, naprawdę cię źle zrozumiałem, również usunąłem głupi komentarz :) – ShayHaned

Odpowiedz

0

EDYTOWANIE: Próg do rozłożenia drzewa na kosz zmienia się w miarę powiększania stołu. Właśnie to robi.

Nie czytałem całego pliku, ale może to być możliwe przyczyny (linia 220)

wykorzystania i przejścia między trybami zwykły vs drzewo komplikuje istnienie podklasy LinkedHashMap. Zobacz poniżej: , aby zapoznać się z metodami haczyków zdefiniowanymi jako wywoływane po wstawieniu, usuwaniem i dostępem, które umożliwiają wewnętrznym połączeniom LinkedHashMap na , w przeciwnym razie pozostaną niezależne od tych mechanizmów. (To również wymaga instancja mapa być przekazywane do niektórych metod użytkowych które mogą tworzyć nowe węzły.)