Когда происходит Rehashing в HashMap

Ответ

Rehashing в HashMap происходит при достижении порогового значения loadFactor (по умолчанию 0.75), когда количество элементов превышает capacity * loadFactor. При этом:

  1. Создается новый массив бакетов с удвоенным размером.
  2. Все существующие элементы пересчитываются (хеш-код ключа & (новый размер - 1)) и перераспределяются по новым бакетам.

Пример:

val map = HashMap<Int, String>(4) // capacity=4, threshold=3 (4*0.75)
map.put(1, "a") 
map.put(2, "b")
map.put(3, "c") // threshold достигнут
map.put(4, "d") // происходит rehashing, capacity становится 8

Важно: rehashing затратная операция, поэтому если заранее известно примерное количество элементов, лучше указать начальный capacity.

Ответ 18+ 🔞

А, слушай, про эту тему я могу рассказывать часами, это ж классика, ёпта. Представь себе обычный HashMap — ну, как шкаф с ящиками, только для данных. Так вот, в этом шкафу ящиков (buckets) изначально ограниченное количество. И есть у него такая хитрая жопа — loadFactor. По умолчанию она 0.75. Это как сигнал «всё, пиздец, пора расширяться».

Вот ты начинаешь туда вещи пихать — пары «ключ-значение». Каждый раз система смотрит: а не пора ли, сука? И когда количество твоих вещей превышает capacity * loadFactor (то есть, грубо, когда ящики заполнены на 75%), наступает момент истины, который и зовётся rehashing. Э сабака сука, операция не из лёгких.

Что происходит? А происходит ёперный театр!

  1. Старый шкаф-массив отправляется нахуй. Создаётся новый, но уже в два раза больше — ящиков овердохуища.
  2. Все твои старые вещи, которые ты так аккуратно складывал, надо теперь переразложить. Берётся каждый ключ, заново считается, в какой ящик нового шкафа его положить (по формуле hashCode ключа & (новый_размер - 1)). Это как переезд на новую квартиру — всё достаёшь, распаковываешь и ищешь, куда бы воткнуть этот дурацкий сервиз.

Вот смотри на примере, тут всё понятно:

val map = HashMap<Int, String>(4) // Делаем шкаф на 4 ящика. Порог (threshold) = 3 (4 * 0.75)
map.put(1, "a") // Всё ок
map.put(2, "b") // Пока терпимо
map.put(3, "c") // Всё, порог в 3 элемента достигнут! Система уже бздит.
map.put(4, "d") // А тут БАМ! — происходит rehashing. Шкаф вырастает до 8 ящиков.

И главная мораль, чувак, которую надо вынести, как хуй с горы: эта операция — пиздец как затратная. Если ты заранее знаешь, что у тебя будет, скажем, тыщща элементов, так не будь распиздяем, укажи начальный capacity! Сделай шкаф сразу побольше, чтобы он не начинал ломать голову и всё перекладывать посреди твоих важных вычислений. Доверия ебать ноль к этой автоматике, если можешь помочь — помоги. Сэкономишь время, нервы и процессорные такты.