Thêm vào câu trả lời của @Lombo
Khi nào bạn sẽ cần ghi đè bằng ()?
Việc triển khai mặc định của Object's bằng () là
public boolean equals(Object obj) {
return (this == obj);
}
có nghĩa là hai đối tượng sẽ chỉ được coi là bằng nhau nếu chúng có cùng địa chỉ bộ nhớ, điều này sẽ đúng chỉ khi bạn so sánh một đối tượng với chính nó.
Nhưng bạn có thể muốn xem xét hai đối tượng giống nhau nếu chúng có cùng giá trị cho một hoặc nhiều thuộc tính của chúng (Tham khảo ví dụ được đưa ra trong câu trả lời của @Lombo).
Vì vậy, bạn sẽ ghi đè equals()
trong các tình huống này và bạn sẽ đưa ra các điều kiện của riêng bạn cho sự bình đẳng.
Tôi đã thực hiện thành công bằng () và nó đang hoạt động rất tốt. Vậy tại sao họ lại yêu cầu ghi đè hashCode ()?
Vâng, miễn là bạn không sử dụng Bộ sưu tập dựa trên "Hash" trên lớp do người dùng xác định, điều đó là ổn. Nhưng đôi khi trong tương lai bạn có thể muốn sử dụng HashMap
hoặc HashSet
nếu bạn không override
và "triển khai chính xác" hashCode () , các bộ sưu tập dựa trên Hash này sẽ không hoạt động như dự định.
Ghi đè chỉ bằng (Bổ sung cho câu trả lời của @Lombo)
myMap.put(first,someValue)
myMap.contains(second); --> But it should be the same since the key are the same.But returns false!!! How?
Trước hết, HashMap kiểm tra xem hashCode của second
có giống như không first
. Chỉ khi các giá trị là như nhau, nó sẽ tiến hành kiểm tra sự bằng nhau trong cùng một nhóm.
Nhưng ở đây, hashCode khác với 2 đối tượng này (vì chúng có địa chỉ bộ nhớ khác nhau - từ cách thực hiện mặc định). Do đó, nó thậm chí không quan tâm để kiểm tra sự bình đẳng.
Nếu bạn có một điểm dừng bên trong phương thức equals () bị ghi đè của mình, nó sẽ không bước vào nếu chúng có các mã băm khác nhau.
contains()
kiểm tra hashCode()
và chỉ khi chúng giống nhau thì nó sẽ gọi equals()
phương thức của bạn .
Tại sao chúng ta không thể thực hiện kiểm tra HashMap cho sự bình đẳng trong tất cả các nhóm? Vì vậy, không cần thiết cho tôi để ghi đè hashCode () !!
Sau đó, bạn đang thiếu điểm của Bộ sưu tập dựa trên Hash. Hãy xem xét những điều sau đây:
Your hashCode() implementation : intObject%9.
Sau đây là các khóa được lưu trữ dưới dạng xô.
Bucket 1 : 1,10,19,... (in thousands)
Bucket 2 : 2,20,29...
Bucket 3 : 3,21,30,...
...
Nói, bạn muốn biết bản đồ có chứa khóa 10. Bạn có muốn tìm kiếm tất cả các thùng không? hoặc bạn chỉ muốn tìm kiếm một thùng?
Dựa trên hashCode, bạn sẽ xác định rằng nếu có 10 thì nó phải có mặt trong Nhóm 1. Vì vậy, chỉ có Nhóm 1 sẽ được tìm kiếm !!