Ответ
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) | Баланс между памятью и производительностью | — |
Практические рекомендации:
- Используйте значение по умолчанию (0.75) в большинстве случаев
- Если известно точное количество элементов, задавайте начальную capacity:
// Для 100 элементов с load factor=0.75 // Начальная capacity = 100 / 0.75 = 134 → округляем до степени двойки: 256 HashMap<String, Integer> map = new HashMap<>(256); - Низкий load factor полезен для HashMap с коротким временем жизни
- Высокий load factor может быть оправдан для HashMap, которые редко изменяются после заполнения
Важно: При resize происходит rehashing — пересчёт хэшей всех элементов и их перераспределение по новым бакетам. Это операция O(n), которая может быть затратной для больших коллекций.