Dim*_*ele 20 java constructor initialization hashset zero
我喜欢HashSet <>()并在使用默认构造函数初始化时急切地使用它:
Set<Users> users = new HashSet<>();
现在,我的自动bean创建器(JBoss工具)将其初始化为:
Set<Users> users = new HashSet<>(0);
为什么零?API告诉我这是初始容量,但将其置于零的优势是什么?这是建议吗?
Jon*_*oni 21
在默认的初始容量为16,所以通过传递0,如果你最终没有放置任何东西,在集,则应保存的记忆几个字节.
除此之外没有真正的优势; 当你传递0时,创建的集合的容量为1,一旦你添加了东西,就必须调整它的大小.
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)在init时保存一些memroy.
这将把它设置为最小值.
很可能这用于关闭代码分析器,如果你没有为集合设置初始容量,它可能会抱怨.通过将其设置为0,您只需将其设置为最小值.
它不是一个优化,因为只要添加一个条目,0.7的加载因子将使容量2,Map.Entry[]在过程中重新创建.