middle
Как и когда происходит увеличение количества корзин в HashMap
Увеличение (resize / rehash) происходит, когда количество элементов превышает пороговое значение threshold = capacity * loadFactor. По умолчанию loadFactor = 0.75, поэтому при начальной capacity = 16 рехеширование произойдет при добавлении 13-го элемента (16 * 0.75 = 12).
Процесс resize:
- Создается новый массив корзин в 2 раза больше текущего.
- Для каждого элемента вычисляется новый индекс корзины (hash & (newCapacity - 1)).
- Элементы распределяются по новым корзинам. Благодаря тому, что capacity — степень двойки, элемент попадает либо в ту же корзину, либо в корзину с индексом
oldIndex + oldCapacity. - Старый массив освобождается для GC.
Resize — дорогая операция O(N), т.к. требует пересмотра всех элементов. Если заранее известно количество элементов, стоит задать initialCapacity в конструкторе: new HashMap<>(expectedSize / 0.75 + 1).
На собеседовании: объясните формулу threshold = capacity * loadFactor. Упомяните, что resize удваивает capacity и перераспределяет элементы. Покажите, что знаете, как избежать лишних resize через initialCapacity.