equals()
equals() so sánh nội dung của các đối tượng có giống nhau hay không. Thường được gọi là so sánh bằng nhau, nếu không ghi đè equals(), bên trong nó sẽ giống như ==, do đó sẽ là so sánh đồng nhất. Vì vậy, nếu bạn muốn so sánh bằng nhau đúng đối tượng, bạn phải sử dụng equals().
hashCode()
hashCode() kiểm tra xem hai đối tượng có phải là cùng một đối tượng hay không. Nó có chức năng so sánh đồng nhất giống như ==, nhưng phương thức hashCode() trả về một giá trị nguyên duy nhất của đối tượng trong thời gian chạy. Thông thường, nó trả về địa chỉ bộ nhớ của đối tượng được lưu trữ trong Heap.
Phương thức này có từ khóa native, điều này có nghĩa là khi sử dụng ngôn ngữ được phát triển bằng ngôn ngữ khác với Java trong Java, thì từ khóa này sẽ được sử dụng.
Hash là gì?
Hashing là quá trình sử dụng hàm băm để tạo ra giá trị đầu ra có kích thước cố định từ giá trị đầu vào có kích thước thay đổi. Giá trị thu được thông qua hashing được gọi là mã băm.
equals() và hashCode()
Vì các đối tượng giống nhau phải có cùng địa chỉ bộ nhớ, nên rõ ràng là các đối tượng giống nhau phải có cùng mã băm. Do đó, nên viết mã để đảm bảo mã băm giống nhau bằng cách ghi đè hashCode() cũng như equals().
Cấu trúc dữ liệu băm
Hãy thử chèn hai đối tượng bằng nhau vào cấu trúc dữ liệu HashSet như trên. Nếu in kích thước của Set này, nó sẽ in ra 2. Tại sao lại như vậy?
Đó là bởi vì cấu trúc dữ liệu sử dụng băm sử dụng hashCode() để xác định Key. Nói cách khác, trước khi so sánh xem các đối tượng có giống nhau hay không, nó sẽ so sánh xem mã băm của hai đối tượng có giống nhau hay không, sau đó xác định xem hai đối tượng có bằng nhau hay không. Trong trường hợp này, nếu hashCode() không được ghi đè, nó sẽ sử dụng hashCode() của Object, do đó nó sẽ trả về địa chỉ bộ nhớ mà mỗi đối tượng được lưu trữ. Vì vậy, khi sử dụng cấu trúc dữ liệu băm, tốt hơn hết là nên ghi đè hashCode() cũng như equals().
Nguồn
Câu hỏi phỏng vấn dự kiến và câu trả lời
Tại sao equals() và hashCode() được sử dụng cùng nhau?
Đó là bởi vì cấu trúc dữ liệu sử dụng băm sử dụng hashCode() để xác định Key. Nói cách khác, trước khi so sánh xem các đối tượng có giống nhau hay không, nó sẽ so sánh xem mã băm của hai đối tượng có giống nhau hay không, sau đó xác định xem hai đối tượng có bằng nhau hay không. Trong trường hợp này, nếu hashCode() không được ghi đè, nó sẽ sử dụng hashCode() của Object, do đó nó sẽ trả về địa chỉ bộ nhớ mà mỗi đối tượng được lưu trữ. Vì vậy, khi sử dụng cấu trúc dữ liệu băm, tốt hơn hết là nên ghi đè hashCode() cũng như equals().
Bình luận0