Что хранится в ячейке (bucket) массива внутри HashMap в Java?

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

Ответ

Каждая ячейка (bucket) внутреннего массива HashMap может содержать одну из следующих структур:

  1. null — ячейка пуста.
  2. Один узел Node<K,V> — если коллизий хеш-кодов нет.
  3. Связный список узлов Node<K,V> — при возникновении коллизии (разные ключи имеют одинаковый хеш для данного bucket).
  4. Красно-черное дерево TreeNode<K,V> (Java 8+) — если коллизий много (по умолчанию, когда список превышает 8 элементов), для обеспечения производительности O(log n).

Структура узла Node:

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash; // Хеш-код ключа
    final K key;    // Ключ
    V value;        // Значение
    Node<K,V> next; // Ссылка на следующий узел в списке/дереве
    // ... методы
}

Почему такая структура? Список обрабатывает редкие коллизии, а дерево оптимизирует поиск при их большом количестве, предотвращая деградацию производительности до O(n).