Theo this blog entry, HashMap reinvokes thực hiện riêng của mình hashCode()
(được gọi là hash()
) trên một hashcode nó đã được lấy ra.Tại sao và như thế nào HashMap có thực hiện nội bộ riêng của hashCode() gọi là hash()?
Nếu quan trọng là không null thì, nó sẽ gọi hashfunction trên đối tượng chủ chốt, xem dòng 4 trong phương pháp trên có nghĩa là key.hashCode(), vì vậy sau khi key.hashCode() trả về hashValue, dòng 4 trông giống như
int hash = hash (hashValue)
và bây giờ, nó áp dụng hàm băm hash trả về vào hàm băm riêng của nó.
Chúng tôi có thể tự hỏi tại sao chúng tôi lại tính toán hashvalue bằng hàm băm (hashValue). Trả lời là, Nó bảo vệ chống lại hàm băm chất lượng kém.
Có thể HashMap chính xác gán lại mã băm không? HashMap có thể lưu trữ các đối tượng, nhưng nó không có quyền truy cập vào logic gán một hashCode các đối tượng của nó. Ví dụ, hash()
không thể nào tích hợp logic đằng sau hashCode()
thực hiện như sau:
public class Employee {
protected long employeeId;
protected String firstName;
protected String lastName;
public int hashCode(){
return (int) employeeId;
}
}
có thể trùng lặp của [Understanding lạ chức năng Java băm] (http://stackoverflow.com/questions/9335169/understanding-strange-java-hash-function) – Nayuki
@NayukiMinase Đoán việc thực hiện của 'hash()' đã thay đổi theo thời gian, vì phiên bản 1.8.0_51 khác/đơn giản hơn (xem câu trả lời của tôi). – Andreas