Вопрос проверяет понимание взаимосвязи этих методов и их важности для коллекций.
Контракт требует:
Если a.equals(b) == true, то a.hashCode() == b.hashCode()
Обратное не обязательно
Нарушение контракта ломает работу HashMap - объекты могут потеряться или дублироваться.
Правила контракта:
Согласованность: При повторных вызовах на неизменном объекте hashCode() должен возвращать одно значение
Равенство объектов → Равенство хэшей (обратное неверно)
Пример нарушения:
class Person {
String name;
@Override
public boolean equals(Object o) { /* сравнение по name */ }
// Нет hashCode() → нарушение контракта
}
Person p1 = new Person("Alice");
Person p2 = new Person("Alice");
map.put(p1, 1);
map.get(p2); // Вернет null, хотя объекты равны!Для HashMap:
Хэш определяет корзину (bucket) для хранения
При коллизиях используется equals() для поиска
Нарушение → объекты попадают в разные корзины