🔁 Override `hashCode()` và `equals()` trong Java – Khi nào và tại sao?
🎯 Mục đích của equals() và hashCode()
Trong Java, hai phương thức này là rất quan trọng để so sánh object và dùng object làm key trong các collection như HashMap, HashSet, Hashtable…
equals()→ so sánh 2 object có “bằng nhau” hay không.hashCode()→ trả về mã băm (hash code), dùng để xác định vị trí lưu trữ object trong Hash-based collections.
🧠 Mặc định thì sao?
Khi không override:
equals()so sánh theo địa chỉ bộ nhớ (==).hashCode()trả về giá trị hash dựa trên địa chỉ object.
⛔ Điều này có thể gây lỗi logic nếu bạn so sánh theo giá trị field bên trong object.
🛠 Ví dụ không override
1
2
3
4
5
6
7
8
9
10
11
12
13
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);
System.out.println(p1.equals(p2)); // false ❌
✅ Cách override equals() và hashCode() chuẩn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Person {
String name;
int age;
// Constructor, getter, setter...
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && name.equals(person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age); // từ Java 7
}
}
✅ Sau khi override:
1
2
3
Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);
System.out.println(p1.equals(p2)); // true ✅
📌 Tại sao phải override cả equals() và hashCode()?
Nếu chỉ override equals() mà không override hashCode(), các collection như HashSet, HashMap sẽ hoạt động không đúng.
Ví dụ:
1
2
3
Set<Person> set = new HashSet<>();
set.add(new Person("Alice", 25));
System.out.println(set.contains(new Person("Alice", 25))); // false ❌ nếu không có hashCode
📌 Quy tắc: Nếu 2 object a.equals(b) là true → a.hashCode() == b.hashCode() phải đúng!
🤔 Khi nào cần override?
- Khi object của bạn dùng làm key cho HashMap, hoặc phần tử trong HashSet.
- Khi bạn cần so sánh object dựa trên giá trị thuộc tính thay vì địa chỉ.
- Khi làm việc với framework cần equals/hashCode (Hibernate, JPA, caching…)
🧠 Tổng kết
equals()giúp so sánh nội dung object.hashCode()hỗ trợ cấu trúc dữ liệu hash.- Nên override cả hai nếu bạn cần làm việc với tập hợp (Set, Map) hoặc so sánh object theo logic riêng.
🚀 Override đúng equals() và hashCode() là kỹ năng Java nền tảng – đừng bỏ qua nhé!
Bài viết này được cấp phép bởi tác giả theo giấy phép CC BY 4.0 .
