Подтвердить что ты не робот

Зачем нужно инициализировать HashSet <> (0) до нуля?

Мне нравится HashSet < > () и с готовностью используйте это при инициализации с помощью конструктора по умолчанию:

Set<Users> users = new HashSet<>();

Теперь мой автоматический создатель bean (инструменты JBoss) инициализирует это как:

Set<Users> users = new HashSet<>(0);

Почему ноль? API говорит мне, что это начальная емкость, но в чем преимущество, если положить это на ноль? Это рекомендуется?

4b9b3361

Ответ 1

Первоначальная емкость по умолчанию равна 16, поэтому, пройдя в 0, вы можете сохранить несколько байтов памяти, если в итоге вы ничего не помещаете в набор.

Кроме этого нет реального преимущества; когда вы проходите 0, набор создается с емкостью 1, и как только вы добавляете что-то, его нужно будет изменить.

Ответ 2

HashSet использует данные хранилища HashMap:

public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}

а initialCapacity = 0,

public HashMap(int initialCapacity, float loadFactor) {
    ....
    // Find a power of 2 >= initialCapacity
    int capacity = 1;
    while (capacity < initialCapacity)
        capacity <<= 1;
}

Емкость HashMap составляет 1.

но если используется конструктор по умолчанию:

public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}

емкость HashMap составляет 16*0.75.

Итак, new HashSet<>(0) сохраните некоторые memroy, когда init.

Ответ 3

Это установит минимальное значение.

Скорее всего, это используется для отключения анализаторов кода, которые могут жаловаться, если вы не установили начальную емкость для коллекций. Установив его на 0, вы просто установите его на минимум.

Это не большая оптимизация, потому что как только вы добавите запись, коэффициент загрузки 0,7 сделает емкость 2, воссоздав Map.Entry[] в процессе.

Ответ 4

Если вы видите документы

Есть некоторые подсказки.

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

Ответ 5

Коэффициент начальной загрузки HashMap равен 16. Когда HashMap содержит данные из 12 записей, которые составляют 75% от его начального размера. то HashMap увеличивает его размер.

Итак, здесь мы просто устанавливаем начальную емкость как 0, передавая ее в Constructor.