Встречается на собеседованиях • сегодня

Что произойдет при создании класса, используемого в качестве ключа, с неравными equals и нереализованными hashCode

Если класс используется как ключ в HashMap или HashSet без корректной реализации hashCode(), но с переопределенным equals(), это приведет к нарушению контракта Object.hashCode(). Основное правило: если equals() возвращает true, hashCode() должен возвращать одинаковые значения.

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

Пример:

java
class BadKey {
    String id;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BadKey badKey = (BadKey) o;
        return Objects.equals(id, badKey.id);
    }
    // hashCode() не реализован!
}

BadKey key1 = new BadKey("a");
BadKey key2 = new BadKey("a");
Map<BadKey, String> map = new HashMap<>();
map.put(key1, "value1");
map.put(key2, "value2"); // Оба ключа могут быть добавлены, хотя equals() true

Результат: map.size() может быть 2, хотя ожидается 1.

Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы