Какое начальное количество корзин (бакетов) создается в HashMap по умолчанию?

Ответ

При создании HashMap конструктором без параметров устанавливается начальная емкость (capacity) в 16 корзин и коэффициент загрузки (load factor) 0.75.

Как это работает:

  1. Емкость 16: означает, что внутренняя хеш-таблица изначально имеет 16 ячеек (бакетов).
  2. Коэффициент загрузки 0.75: определяет порог заполнения для увеличения размера. При достижении capacity * loadFactor элементов (т.е. 16 * 0.75 = 12) происходит удвоение емкости и рехеширование всех элементов.

Примеры создания:

// Дефолтные параметры: 16 бакетов, load factor 0.75
Map<String, Integer> defaultMap = new HashMap<>();

// Указание начальной емкости (округлится до степени двойки)
Map<String, Integer> customMap = new HashMap<>(32); // Фактически 32 бакета
Map<String, Integer> customMap2 = new HashMap<>(50); // Округлится до 64

Важно: Фактическое количество бакетов всегда является степенью двойки. Если в конструкторе указана произвольная емкость, она автоматически округляется вверх до ближайшей степени двойки.

Ответ 18+ 🔞

А, ну это классика, блядь! Смотри, как устроена эта ваша HashMap, чтобы не быть полным распиздяем в коде.

Вот берёшь ты её голыми руками, без параметров — она тебе сразу подсовывает 16 корзин внутри и коэффициент загрузки 0.75. Это типа заводские настройки, дефолтные, нахуй.

Как это, сука, работает, чтобы не облажаться:

  1. Ёмкость 16: Это значит, что внутри у неё, как в общежитии, 16 комнат-бакетов изначально. Пустых, блядь.
  2. Коэффициент 0.75: Это сторож-алкаш, который следит за бардаком. Как только в эти комнаты набивается ёмкость * коэффициент жильцов, то есть 16 * 0.75 = 12 элементов — всё, пиздец, терпение лопается. Карта берёт, удваивает количество комнат до 32 (всех выгоняет на улицу и заново расселяет по новому адресу). Это и есть рехеширование, ёпта.

Ну и примеры, чтобы вообще всё встало на свои места:

// Так сделаешь — получишь те самые 16 бакетов и load factor 0.75. Стандартный набор лоха.
Map<String, Integer> defaultMap = new HashMap<>();

// А вот если ты не лох и заранее знаешь, что дерьма будет много — укажи размер.
// Скажешь 32 — получишь 32 комнаты. Честно.
Map<String, Integer> customMap = new HashMap<>(32);

// Скажешь 50 — а она тебе, хитрая жопа, округлит до ближайшей степени двойки, то есть до 64.
// Потому что ей так, блядь, удобнее с битовыми операциями возиться.
Map<String, Integer> customMap2 = new HashMap<>(50); // На деле будет 64 бакета

Запомни раз и нахуй: Внутри количество этих бакетов ВСЕГДА степень двойки. Это её фетиш, блядь. Сказал 50 — получи 64. Сказал 1000 — получи 1024. Не нравится — пиши свою реализацию, умник.