Gymterview
middle

Как и когда происходит увеличение количества корзин в HashMap

Увеличение (resize / rehash) происходит, когда количество элементов превышает пороговое значение threshold = capacity * loadFactor. По умолчанию loadFactor = 0.75, поэтому при начальной capacity = 16 рехеширование произойдет при добавлении 13-го элемента (16 * 0.75 = 12).

Процесс resize:

  1. Создается новый массив корзин в 2 раза больше текущего.
  2. Для каждого элемента вычисляется новый индекс корзины (hash & (newCapacity - 1)).
  3. Элементы распределяются по новым корзинам. Благодаря тому, что capacity — степень двойки, элемент попадает либо в ту же корзину, либо в корзину с индексом oldIndex + oldCapacity.
  4. Старый массив освобождается для GC.

Resize — дорогая операция O(N), т.к. требует пересмотра всех элементов. Если заранее известно количество элементов, стоит задать initialCapacity в конструкторе: new HashMap<>(expectedSize / 0.75 + 1).

На собеседовании: объясните формулу threshold = capacity * loadFactor. Упомяните, что resize удваивает capacity и перераспределяет элементы. Покажите, что знаете, как избежать лишних resize через initialCapacity.