Какой размер массива корзин (buckets) в HashMap и как он изменяется?

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

Ответ

Размер массива корзин в HashMap всегда является степенью двойки. Это позволяет эффективно вычислять индекс корзины через битовую операцию (n - 1) & hash.

Поведение по умолчанию:

  • Начальная емкость (initial capacity): 16.
  • Коэффициент загрузки (load factor): 0.75.
  • Порог расширения (threshold): емкость * load factor. При достижении этого количества элементов массив корзин увеличивается вдвое.

Пример процесса:

HashMap<String, Integer> map = new HashMap<>(); // Создается массив на 16 корзин.
// Порог = 16 * 0.75 = 12.
for (int i = 0; i < 12; i++) {
    map.put("key" + i, i); // Добавление 12 элементов.
}
// При добавлении 13-го элемента порог превышен.
map.put("key12", 12); // Запускается resize().
// Внутренний массив пересоздается с емкостью 32, все элементы перераспределяются.

Ограничения:

  • Максимальная емкость: 1 << 30 (1073741824).
  • Минимальная: 1 (если задана явно в конструкторе). Любое значение, переданное в конструктор, округляется вверх до ближайшей степени двойки.