Sobes.tech
Junior — Middle

Pourquoi deux objets avec le même hashCode peuvent-ils avoir des résultats différents lors de la comparaison avec equals?

sobes.tech IA

Réponse de l'IA

В Java метод hashCode() возвращает целочисленное значение, которое используется для быстрого поиска объектов в хэш-структурах, например, в HashMap или HashSet. Однако одинаковый hashCode не гарантирует, что объекты равны.

Причина в том, что hashCode — это всего лишь хэш-функция, которая может давать коллизии, то есть разные объекты могут иметь одинаковый хэш.

Метод equals() определяет фактическое равенство объектов по их содержимому или логике сравнения.

Таким образом, два объекта могут иметь одинаковый hashCode, но при сравнении через equals() вернуть false, если они отличаются по значимым полям.

Пример:

class Person {
    String name;
    int age;

    @Override
    public int hashCode() {
        return 42; // намеренно простой хэш для примера
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Person)) return false;
        Person p = (Person) o;
        return age == p.age && name.equals(p.name);
    }
}

Person p1 = new Person("Alice", 30);
Person p2 = new Person("Bob", 25);

System.out.println(p1.hashCode() == p2.hashCode()); // true
System.out.println(p1.equals(p2)); // false

Важно, чтобы при переопределении equals() всегда переопределять и hashCode() так, чтобы равные объекты имели одинаковый хэш, но обратное не обязательно.