Bài viết

🔁 Override `hashCode()` và `equals()` trong Java – Khi nào và tại sao?

🎯 Mục đích của equals()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()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()hashCode()?

Nếu chỉ override equals()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 .