← Назад к вопросам

Под какое количество элементов изначально создается HashMap

1.7 Middle🔥 151 комментариев
#JVM и память#Коллекции и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Изначальная емкость HashMap в Java

Изначальная емкость HashMap по умолчанию зависит от версии Java, но в современных реализациях (Java 8+) она составляет 16. Однако важно понимать, что это не "количество элементов", а именно емкость (capacity) – количество корзин (buckets) для хранения данных.

Детали реализации по умолчанию

В конструкторе без параметров:

public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // 0.75
}

Фактическое создание таблицы происходит при первом добавлении элемента (ленивая инициализация). Размер определяется константой:

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // 16

Важные аспекты

  1. Load Factor (коэффициент загрузки) – по умолчанию 0.75

    • Когда количество элементов достигает capacity * loadFactor, происходит автоматическое увеличение вдвое (rehashing)
    • Для емкости 16: при добавлении 12-го элемента емкость увеличится до 32
  2. Избежание коллизий – правильный выбор начальной емкости важен:

    // Если планируется хранить 100 элементов
    Map<String, String> map = new HashMap<>(134); // 100 / 0.75 ≈ 134
    
  3. Версии Java:

    • Java 7 и ранее: емкость 16, но таблица создавалась сразу в конструкторе
    • Java 8+: ленивая инициализация (таблица создается при первом put())

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

  • Избегайте перехеширования: если известно примерное количество элементов, задавайте емкость явно:

    // Для 50 элементов: 50 / 0.75 = 67 → ближайшая степень двойки 64
    Map<String, Integer> map = new HashMap<>(64);
    
  • Производительность: начальная емкость влияет на:

    • Частоту перехеширований
    • Распределение элементов по корзинам
    • Время выполнения операций put() и get()
  • Особые случаи:

    • При создании HashMap из другой коллекции:
    List<String> list = Arrays.asList("a", "b", "c");
    Map<String, Integer> map = new HashMap<>(Math.max(
        (int) (list.size() / 0.75f) + 1, 16));
    

Таким образом, по умолчанию HashMap создается с емкостью 16 корзин, но фактическое создание происходит при первом добавлении элемента. Оптимальный выбор начальной емкости позволяет избежать дорогостоящих операций перехеширования и поддерживать производительность на уровне O(1) для основных операций.

Под какое количество элементов изначально создается HashMap | PrepBro