Sobes.tech
Назад к вопросам
Junior — Middle
60

Почему два объекта с одинаковым hashCode могут иметь разные результаты при сравнении через equals?

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

В 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() так, чтобы равные объекты имели одинаковый хэш, но обратное не обязательно.