제이온

equals() so với hashCode()

  • Ngôn ngữ viết: Tiếng Hàn Quốc
  • Quốc gia: Tất cả các quốc giacountry-flag
  • CNTT

Đã viết: 2024-04-25

Đã viết: 2024-04-25 22:29

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

[Phi chuyên ngành, trở thành Developer] 14. Tóm tắt những câu hỏi kỹ thuật thường gặp trong phỏng vấn tuyển dụng Developer mớiBài viết này tóm tắt những câu hỏi kỹ thuật thường gặp trong phỏng vấn tuyển dụng Developer mới (vùng nhớ, cấu trúc dữ liệu, cơ sở dữ liệu, v.v.). Hy vọng bài viết sẽ giúp ích cho quá trình chuẩn bị phỏng vấn của bạn.
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자
투잡뛰는 개발 노동자

April 3, 2024