为什么将HashSet <>(0)初始化为零?

Dim*_*ele 20 java constructor initialization hashset zero

我喜欢HashSet <>()并在使用默认构造函数初始化时急切地使用它:

Set<Users> users = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)

现在,我的自动bean创建器(JBoss工具)将其初始化为:

Set<Users> users = new HashSet<>(0);
Run Code Online (Sandbox Code Playgroud)

为什么?API告诉我这是初始容量,但将其置于零的优势是什么?这是建议吗?

Jon*_*oni 21

默认的初始容量为16,所以通过传递0,如果你最终没有放置任何东西,在集,则应保存的记忆几个字节.

除此之外没有真正的优势; 当你传递0时,创建的集合的容量为1,一旦你添加了东西,就必须调整它的大小.

  • @Vash 1是2的幂.从HashMap` //找到2的幂> = initialCapacity int capacity = 1; while(capacity <initialCapacity)capacity << = 1;` (4认同)

lic*_*gwu 6

HashSet使用HashMap存储数据:

public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
Run Code Online (Sandbox Code Playgroud)

而initialCapacity = 0,

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

HashMap的容量是1.

但是如果使用默认构造函数:

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

HashMap的容量是16*0.75.

所以,new HashSet<>(0)在init时保存一些memroy.


Pet*_*rey 5

这将把它设置为最小值.

很可能这用于关闭代码分析器,如果你没有为集合设置初始容量,它可能会抱怨.通过将其设置为0,您只需将其设置为最小值.

它不是一个优化,因为只要添加一个条目,0.7的加载因子将使容量2,Map.Entry[]在过程中重新创建.