Ответ
По умолчанию HashMap создается с начальной емкостью 16 и коэффициентом загрузки 0.75. Это означает, что при достижении 12 элементов (16 * 0.75) произойдет автоматическое увеличение размера (rehashing).
Можно задать свою начальную емкость в конструкторе:
val map = HashMap<Int, String>(32) // емкость 32, порог расширения 24
Важно: Реальная емкость всегда округляется вверх до ближайшей степени двойки (например, 10 → 16, 20 → 32). Это связано с оптимизацией хэширования.
Ответ 18+ 🔞
А, блядь, этот ваш HashMap! Ну классика же, ёпта. Сидишь такой, думаешь — ну 16, красивое число, всё чётко. А потом бац — и он тебе посреди ночи, когда нагрузка пиковая, начинает рехешироваться, потому что порог-то 12 элементов, ядрёна вошь!
Представь: у тебя уже 12 ключей засунуто, всё летает, и ты такой — ну всё, красава. А он тебе в этот самый момент — хрясь! — и начинает всё внутренности перестраивать, производительность в тартары. Волнение ебать! А всё потому, что дефолтные настройки — они для игрушек, для демо. В реальной жизни, если ты заранее знаешь, что элементов будет, ну, скажем, тысяч двадцать, ты же не будешь ждать, пока он 16 раз расширится? Это ж пиздец как неэффективно.
Вот смотри, пишешь ты:
val map = HashMap<Int, String>(32)
Казалось бы, дал ему 32 — и спи спокойно. Ан хуй там! Он же хитрый, сука. Он это число возьмёт, посмотрит на него своим алгоритмическим взглядом и скажет: «Ну это не степень двойки, ёб твою мать». И округлит вверх. Попросишь 10 — получишь 16. Попросишь 20 — получишь 32. Попросишь 1000 — получишь 1024. Сам от такого охуеешь сначала. Зачем? Да всё для той же чёрной магии с битовыми операциями, чтобы индекс по хэшу находить быстрее, чем ты успеешь сказать «залупа конская».
Так что запомни, чувак: указал ты 32 — порог расширения будет 24 (32 * 0.75). И реальная ёмкость тоже станет 32, потому что оно и так степень двойки. А вот если напишешь HashMap(50), то внутри будет массив на 64 ячейки, и рехешировать начнёт при 48 элементах. Вот такая хитрая жопа.
Короче, мораль: если не хочешь неожиданных тормозов, прикинь хотя бы примерно, сколько элементов будет, и создавай HashMap с запасом. А то будет тебе хиросима в runtime, а не коллекция.