Как устроен HashMap внутри, что происходит при коллизиях и resize?

По умолчанию load factor равен 0.75, что означает, что при заполнении 75% текущих бакетов происходит перераспределение (resize) с увеличением количества бакетов в два раза.

Короткий ответ

Что ответить на собеседовании

В Java HashMap расширение хранилища бакетов (то есть увеличение количества корзин для хранения элементов) происходит при достижении определённого порога заполнения, который задаётся параметром load factor (коэффициент загрузки). По умолчанию load factor равен 0.75, что означает, что при заполнении 75% текущих бакетов происходит перераспределение (resize) с увеличением количества бакетов в два раза.

Подробный разбор

Ответ с пояснениями

В Java HashMap расширение хранилища бакетов (то есть увеличение количества корзин для хранения элементов) происходит при достижении определённого порога заполнения, который задаётся параметром load factor (коэффициент загрузки). По умолчанию load factor равен 0.75, что означает, что при заполнении 75% текущих бакетов происходит перераспределение (resize) с увеличением количества бакетов в два раза.

Таким образом, настройка, влияющая на расширение хранилища бакетов — это load factor. При создании HashMap можно указать этот параметр:

HashMap<K, V> map = new HashMap<>(initialCapacity, loadFactor);

Где:

  • initialCapacity — начальное количество бакетов
  • loadFactor — коэффициент загрузки, после достижения которого происходит расширение

Если load factor уменьшить, расширение будет происходить чаще, но поиск будет быстрее из-за меньшей плотности элементов в бакетах. Если увеличить — расширение будет реже, но производительность может ухудшиться из-за увеличения коллизий.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее