Что произойдет при повторной вставке пары с null-значением в HashMap, если ключи равны по equals(), а hashCode() возвращает константу?

«Что произойдет при повторной вставке пары с null-значением в HashMap, если ключи равны по equals(), а hashCode() возвращает константу?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Произойдет перезапись значения для существующего ключа. Размер HashMap не изменится.

Механизм:

  1. Поиск ключа: hashCode() (константа) → определение бакета.
  2. В найденном бакете ключи сравниваются через equals().
  3. При equals() == true старое значение заменяется новым (даже если новое — null).

Пример:

class Key {
    @Override
    public int hashCode() { return 1; }
    @Override
    public boolean equals(Object obj) { return true; } // Все ключи равны
}

HashMap<Key, String> map = new HashMap<>();
Key k1 = new Key();
Key k2 = new Key();

map.put(k1, "First");
map.put(k2, null); // Перезаписывает "First" на null
// map.size() == 1
// map.get(k1) == null

Последствия: Константный hashCode() приводит к коллизиям всех ключей в одном бакете, катастрофически снижая производительность.