Назад к вопросам
OZON
Junior — Middle
68
Что произойдет, если попытаться вставить два объекта, считая их равными по equals, но с различными значениями hashCode, в HashMap?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Если два объекта считаются равными по методу equals(), но имеют разные значения hashCode(), то при вставке в HashMap поведение будет некорректным.
Почему?
HashMapсначала используетhashCode()для определения корзины (bucket), куда поместить объект.- Затем внутри корзины сравнивает объекты через
equals()для проверки равенства ключей.
Если hashCode() у равных объектов разный, они попадут в разные корзины, и HashMap не сможет обнаружить, что ключ уже существует.
В итоге:
- В
HashMapмогут появиться дубликаты ключей, что нарушает контракт коллекции. - Поиск по ключу может не найти объект, даже если он есть, потому что
hashCode()не совпадает.
Пример:
class Key {
private int id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Key)) return false;
Key key = (Key) o;
return id == key.id;
}
@Override
public int hashCode() {
return id + 1; // Ошибка: для равных объектов должен быть одинаковый hashCode
}
}
Если equals считает два объекта равными (например, id=1), но hashCode возвращает разные значения, HashMap будет работать неправильно.
Поэтому важно соблюдать контракт: если equals(a, b) == true, то hashCode(a) == hashCode(b).