Ответ
Каждая ячейка (bucket) внутреннего массива HashMap может содержать одну из следующих структур:
null— ячейка пуста.- Один узел
Node<K,V>— если коллизий хеш-кодов нет. - Связный список узлов
Node<K,V>— при возникновении коллизии (разные ключи имеют одинаковый хеш для данного bucket). - Красно-черное дерево
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).