2013-08-06 2 views
20

Я люблю HashSet <>() и использовать жадность при инициализации этого с помощью конструкторы по умолчанию:Зачем нужно инициализировать HashSet <> (0) до нуля?

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

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

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

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

ответ

21

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

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

+0

@PeterLawrey Минимум также 16? Тогда 0 не должен работать? – Aquillo

+0

@PeterLawrey, Почему? Не 2? –

+0

+1 К сожалению, для этого конструктора минимум равен 1. –

3

If you see docs

Существует некоторый ключ.

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

6

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.

5

Это установит его как минимум.

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

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

0

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

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

Смежные вопросы