Встречается на 2% собеседований по Java

Какие проблемы могут возникнуть в HashMap, если переопределить hashCode, но не переопределять equals

Если переопределить hashCode(), но не переопределить equals(), могут возникнуть следующие проблемы:

  1. Нарушение контракта: Согласно контракту Object, если два объекта равны по equals(), они должны иметь одинаковый hashCode(). Обратное не обязательно. Непереопределенный equals() будет сравнивать ссылки, что может привести к логическим ошибкам.
  1. Потеря данных: В HashMap объекты с одинаковым хеш-кодом, но разными по equals(), будут помещены в одну корзину (bucket). Но при поиске по ключу HashMap сначала ищет по хеш-коду, а затем сравнивает через equals().

Пример:

java
class Key {
    int id;

    @Override
    public int hashCode() { return id; }
    // equals() не переопределен
}

Key k1 = new Key(); k1.id = 1;
Key k2 = new Key(); k2.id = 1;

Map<Key, String> map = new HashMap<>();
map.put(k1, "Value");
map.get(k2); // вернет null, т.к. k1 != k2 по equals()
Sophi
Софи собрала все вопросы. Тренируйся и получай
офферы быстрее!
Попробовать бесплатноArrow

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

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

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