Что такое load factor в HashMap и как он влияет на производительность?

«Что такое load factor в HashMap и как он влияет на производительность?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Load factor (коэффициент загрузки) в HashMap — это пороговое значение заполнения, при достижении которого происходит увеличение ёмкости (capacity) и перераспределение элементов (rehashing).

Значение по умолчанию: 0.75f (75%)

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

// Создание HashMap с capacity=16 и load factor=0.75 (по умолчанию)
HashMap<String, Integer> map = new HashMap<>();

// При добавлении 12-го элемента (16 * 0.75 = 12)
// происходит resize: capacity увеличивается вдвое до 32
// и все элементы перераспределяются по новым бакетам

Настройка load factor:

// Явное указание capacity и load factor
HashMap<String, Integer> map = new HashMap<>(32, 0.5f);
// Ресайз произойдёт при 16 элементах (32 * 0.5)

Влияние на производительность:

Load factor Преимущества Недостатки
Высокий (0.9-1.0) Меньше ресайзов, экономия памяти Больше коллизий, снижение производительности операций поиска/вставки
Низкий (0.5-0.6) Меньше коллизий, быстрые операции Частые ресайзы, больше потребление памяти
Оптимальный (0.75) Баланс между памятью и производительностью

Практические рекомендации:

  1. Используйте значение по умолчанию (0.75) в большинстве случаев
  2. Если известно точное количество элементов, задавайте начальную capacity:
    // Для 100 элементов с load factor=0.75
    // Начальная capacity = 100 / 0.75 = 134 → округляем до степени двойки: 256
    HashMap<String, Integer> map = new HashMap<>(256);
  3. Низкий load factor полезен для HashMap с коротким временем жизни
  4. Высокий load factor может быть оправдан для HashMap, которые редко изменяются после заполнения

Важно: При resize происходит rehashing — пересчёт хэшей всех элементов и их перераспределение по новым бакетам. Это операция O(n), которая может быть затратной для больших коллекций.