Tôi vừa đọc về sự khác biệt giữa lớp HashMap và HashTable trong java. Ở đó tôi tìm thấy một sự khác biệt mà trước đây cho phép null phím và sau đó không đặc quyền cho cùng. Theo như làm việc của HashMap là mối quan tâm tôi biết rằng, nó gọi phương pháp hashcode trên chìa khóa để tìm kiếm trong đó cặp giá trị khóa được đặt. Dưới đây là câu hỏi của tôi: Làm thế nào hashcode cho một giá trị null được tính toán hoặc có bất kỳ giá trị mặc định cho hashcode của null key (nếu có xin vui lòng xác định giá trị)?Hashcode cho khóa NULL trong HashMap
Trả lời
từ HashMap:
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
...
và nếu bạn nhìn xa hơn, bạn sẽ thấy vô luôn đi vào bin 0
Nếu bạn đọc mô tả về static int hash(int h)
phương pháp trong HashMap bạn sẽ thấy rằng phím rỗng có chỉ số 0.
Khi giá trị rỗng tồn tại trong bản đồ, khóa của giá trị đó cũng là rỗng. bạn không thể có nhiều khóa null trong bản đồ. Chỉ có một phím null.
Từ mã nguồn của HashMap, nếu khóa là null
, nó được xử lý khác nhau. Không có mã băm nào được tạo ra cho null, nhưng nó được lưu trữ duy nhất tại chỉ số 0 trong mảng nội bộ với giá trị băm 0. Cũng lưu ý rằng giá trị băm của một chuỗi rỗng cũng là 0 (trong trường hợp các khóa là chuỗi), nhưng chỉ mục ở đó được lưu trữ trong mảng nội bộ đảm bảo rằng chúng không được trộn lẫn.
/**
* Offloaded version of put for null keys
*/
private V putForNullKey(V value) {
for (Entry<K,V> e = table[0]; e != null; e = e.next) {
if (e.key == null) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(0, null, value, 0);
return null;
}
Nó nêu rõ điều gì sẽ xảy ra khi bạn đặt một khóa có sẵn trên bản đồ. Trường hợp cụ thể của khóa == null hoạt động theo cùng một cách: bạn không thể có hai ánh xạ khác nhau cho khóa rỗng (giống như bạn không thể cho bất kỳ khóa nào khác). Nó không phải là một trường hợp đặc biệt, cho bối cảnh của câu hỏi của bạn.
- 1. Java - Lý do cho phép null là một khóa HashMap?
- 2. Tùy chỉnh hashcode/bằng hoạt động cho HashMap
- 3. Chuỗi là khóa trong hashmap
- 4. Lợi ích của việc cho phép nhiều khóa null trong hashmap là gì?
- 5. Sử dụng HashMap với khóa tùy chỉnh
- 6. HashMap được trả về NULL
- 7. Kiểm tra tồn tại khóa trong HashMap
- 8. Java - lấy chỉ mục khóa trong HashMap?
- 9. Nhận chìa khóa từ HashMap trong Java
- 10. Độ phân giải va chạm trong HashMap
- 11. WeakHashMap vs HashMap
- 12. Chỉ định UserId cho khóa ngoài = null
- 13. Lý thuyết JUnit cho hashCode/equals contract
- 14. Tìm kiếm giá trị cho một khóa đã cho trong HashMap
- 15. Double in HashMap
- 16. Có thể đổi tên khóa Hashmap không?
- 17. hashCode và equals cho Collections.unmodifiableCollection()
- 18. thử nghiệm cho các khóa trống/chuỗi null trong django
- 19. Đặt lớp của riêng làm khóa trong java Hashmap
- 20. Cho phép null bằng khóa ngoài cho người dùng. Django
- 21. HashMap trong vòng một HashMap
- 22. Weird hành vi serialization với HashMap
- 23. Nested foreach trong MyBatis 3 cho thông số HashMap
- 24. Chiến lược triển khai hashCode
- 25. vấn đề Deserialization HashMap trong Android
- 26. HashMap sử dụng LinkedList nội
- 27. Return Giá trị đặt() trong HashMap: Java
- 28. Số lượng các nhóm trong HashMap có ý nghĩa gì?
- 29. Java hashCode cho một lớp Point
- 30. Lặp qua 'Hashmap' trong JavaScript
Điều đó tôi nhận được từ mã lớp HashMap nhưng mã băm được tạo ra để đặt cặp giá trị khóa đó trong bin 0 có nghĩa là giá trị hashcode của bin 0. – Prashant
có nghĩa là hashcode cho null là 0 hoặc (lý thuyết), bất kỳ số nào duy trì num & (tableSize-1) == 0 – radai
Bạn có muốn nói rằng đối với khóa null, giá trị mặc định của hashcode là 0 và thùng/thùng đầu tiên sẽ được sử dụng để đặt nó theo Triển khai HashMap. – Prashant