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?
@ShayHaned Huh? – Michael
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
@zhuguowei, przykro mi w tym przypadku, naprawdę cię źle zrozumiałem, również usunąłem głupi komentarz :) – ShayHaned