Tôi đọc mã của lớp HashMap được cung cấp bởi Java 1.6 API và không thể hiểu đầy đủ nhu cầu của các hoạt động sau đây (tìm thấy trong cơ thể của đặt và có được phương pháp):Tại sao HashMap lại phục hồi mã băm do đối tượng khóa cung cấp?
int hash = hash(key.hashCode());
nơi phương pháp hash()
có cơ thể sau đây:
private static int hash(int h) {
h ^= (h >>> 20)^(h >>> 12);
return h^(h >>> 7)^(h >>> 4);
}
này có hiệu quả tính toán lại băm bằng cách thực hiện các hoạt động bit trên hashcode cung cấp. Tôi không thể hiểu được sự cần thiết phải làm như vậy mặc dù API khẳng định nó như sau:
này là rất quan trọng bởi vì HashMap sử dụng năng lượng-of-hai bảng chiều dài băm, mà khác gặp phải va chạm cho hashcodes rằng không khác nhau ở các bit thấp hơn.
Tôi hiểu rằng phân tích giá trị khóa được lưu trữ trong một mảng cấu trúc dữ liệu và vị trí chỉ mục của một mục trong mảng này được xác định bởi hàm băm của nó. Điều tôi không hiểu là hàm này sẽ thêm bất kỳ giá trị nào vào phân phối băm.
"chỉ trong trường hợp" ? Trên thực tế, hầu hết các mã băm trong Java sẽ trở nên điên rồ. Chỉ cần nhìn vào java.lang.Integer, ví dụ! Nhưng điều này thực sự có ý nghĩa. Sẽ tốt hơn nếu bạn nói "mọi người đều có thể sử dụng Object.hashCode() có phân phối bit crappy, miễn là chúng tuân theo quy tắc hashcodes bằng các đối tượng bằng nhau, và cố gắng tránh va chạm càng nhiều càng tốt." Sau đó, chỉ triển khai bộ sưu tập như HashMap có gánh nặng truyền các giá trị đó thông qua hàm băm thứ cấp, thay vì nó là vấn đề của mọi người. –
'các vị trí số lẻ của hashmap sẽ không bao giờ được sử dụng' Tôi không hiểu nó. Bạn có thể đưa ra một ví dụ không? –
Ok, hãy tưởng tượng tôi đang băm các đối tượng nhân viên, và tất cả nhân viên của tôi có một trường ID int như "400114", "400214", "400314", v.v ... (tất cả đều chia sẻ phần "14" của ID của họ là hậu tố của bộ phận của tôi). Phương thức hashCode() của Integer trả về số nguyên - vì vậy nếu tôi sử dụng các ID nhân viên làm các khóa trong hash HashSet/without/HashMap (int h), sự lây lan sẽ rất, rất không đồng đều. Trong ví dụ này, kể từ 14 ví dụ, thậm chí chỉ có cả nhóm sẽ được sử dụng. – tucuxi