Вопрос проверяет понимание контракта между методами equals() и hashCode() в Java и последствий его нарушения.
Если объекты равны по equals(), но имеют разные hashCode(), это нарушает контракт этих методов. Такие объекты будут некорректно работать в hash-коллекциях (HashMap, HashSet). Они могут не находиться в коллекции, даже если были добавлены, или могут создавать дубликаты. Это приводит к непредсказуемому поведению программы.
Контракт между equals() и hashCode() является фундаментальным принципом работы с hash-коллекциями в Java.
Требования контракта:
Если два объекта равны по equals(), их hashCode() должен быть одинаковым
Обратное не обязательно: разные объекты могут иметь одинаковый hashCode()
Последствия нарушения контракта:
Проблемы с HashMap/HashSet:
Объекты могут не находиться в коллекции, даже если они там есть
Возможны дубликаты объектов в Set-коллекциях
Поиск и удаление элементов работают некорректно
Пример проблемы:
class Person {
String name;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name);
}
// Нарушение: hashCode не переопределен
}
Person p1 = new Person("John");
Person p2 = new Person("John");
System.out.println(p1.equals(p2)); // true
System.out.println(p1.hashCode() == p2.hashCode()); // false - нарушение!
Set<Person> set = new HashSet<>();
set.add(p1);
set.contains(p2); // может вернуть false, хотя должен trueПравильная реализация:
@Override
public int hashCode() {
return Objects.hash(name);
}Вывод: Всегда необходимо обеспечивать соответствие между equals() и hashCode() для корректной работы с hash-коллекциями.