2017-05-26 15 views
6

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?

+0

@ShayHaned Huh? – Michael

+0

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

+0

@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

Trả lời

0

CHỈNH SỬA: Ngưỡng để tạo thùng thay đổi khi bảng được làm lớn hơn. Đó là những gì nó đang làm.

Tôi đã không đọc toàn bộ tập tin, nhưng điều này có thể là một lý do có thể (dòng 220)

Việc sử dụng và hiệu ứng chuyển tiếp giữa các đồng bằng vs chế độ cây được phức tạp bởi sự tồn tại của lớp con LinkedHashMap. Xem bên dưới để biết các phương thức móc được định nghĩa để được gọi khi chèn, xóa và truy cập cho phép nội bộ LinkedHashMap đến nếu không thì vẫn độc lập với các cơ chế này. (Điều này cũng yêu cầu một bản đồ được chuyển đến một số phương thức tiện ích có thể tạo các nút mới.)