Sau khi đọc source code của java.util.HashMap#resize
, tôi rất bối rối với một số phần - đó là khi một số bin
có nhiều hơn một nút.nhầm lẫn về hashmap # thay đổi kích thước
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;
}
}
Tại sao tôi cảm thấy phần này không cần phải tồn tại? Chỉ cần sử dụng mã bên dưới
newTab[e.hash & (newCap - 1)] = e;
là ok - tôi nghĩ chúng có cùng tác dụng.
Vậy tại sao phải có quá nhiều mã trong nhánh khác?
@ShayHaned Huh? – Michael
Cảm ơn! nhưng có thể bạn hiểu nhầm tôi, tôi không nhầm lẫn về 'e.hash & (newCap - 1) '. Tôi nhầm lẫn về lý do tại sao trong nhánh khác cần rất nhiều mã tôi nghĩ rằng chỉ cần sử dụng 'newTab [e.hash & (newCap - 1)] = e;' có thể có tác dụng tương tự. – zhuguowei
@zhuguowei, xin lỗi trong trường hợp đó, thực sự đã hiểu lầm bạn, cũng đã xóa nhận xét ngu ngốc :) – ShayHaned