Как HashMap обрабатывает вставку элемента с ключом null, если hashCode() ключа возвращает константу?

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

Ответ

Ключ null всегда помещается в бакет 0, независимо от реализации hashCode(). Константный hashCode() влияет только на не-null ключи, вызывая коллизии и вырождение производительности до O(n).

Пример:

HashMap<String, String> map = new HashMap<>();
map.put(null, "valueNull"); // Бакет 0
map.put("key1", "value1"); // Коллизия, если hashCode("key1") == const
map.put("key2", "value2"); // Еще одна коллизия в том же бакете

Важно:

  • Начиная с Java 8, при превышении порога (TREEIFY_THRESHOLD = 8) связный список в бакете преобразуется в красно-черное дерево, улучшая поиск до O(log n).
  • Для null-ключа hashCode() не вызывается, используется фиксированный хэш 0.