Java 为什么要初始化HashSet<&燃气轮机;(0)到零?

Java 为什么要初始化HashSet<&燃气轮机;(0)到零?,java,constructor,initialization,hashset,zero,Java,Constructor,Initialization,Hashset,Zero,我喜欢HashSet(),并在使用默认构造函数初始化时急切地使用它: Set<Users> users = new HashSet<>(); public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); table = new Entry[DEFAULT_INI

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

Set<Users> users = new HashSet<>();
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}
Set users=new HashSet();
现在,我的自动bean创建者(JBoss工具)将其初始化为:

Set<Users> users = new HashSet<>(0);
Set users=newhashset(0);
为什么为零?API告诉我这是初始容量,但将其设置为零有什么好处?建议这样做吗?

有一些线索

迭代这个集合需要的时间与HashSet实例的大小(元素数)加上支持HashMap实例的“容量”(bucket数)之和成比例。因此,如果迭代性能很重要,那么不要将初始容量设置得太高(或负载系数太低),这一点非常重要

因此,通过传入0,如果最终没有在集合中放入任何内容,则可以节省一些字节的内存


除此之外,没有真正的优势;当您传递0时,将创建容量为1的集合,并且一旦添加内容,就必须调整其大小。

HashSet使用HashMap存储数据:

public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
HashMap容量为
16*0.75


因此,
newhashset(0)
在初始化时保存一些内存。

这将把它设置为最小值

这很可能是用来关闭代码分析器的,如果您没有设置初始收集容量,代码分析器可能会发出抱怨。通过将其设置为0,您只需将其设置为最小值


这并不是一个很大的优化,因为只要添加一个条目,负载系数0.7将使容量为2,在这个过程中重新创建
Map.entry[]

HashMap的初始负载系数是16。当HashMap保存12条记录的数据时,这是其初始大小的75%。然后HashMap增加其大小


在这里,我们只是通过在构造函数中传递初始容量来将其设置为0。

@PeterLawrey,为什么?“不是2吗?”彼得拉维,是2。它必须是2的幂>=2。参见HashMap的构造函数(int,int)@Vash 1是2的幂。从HashMap`//找到2的幂>=initialCapacity int capacity=1;当(容量<初始容量)容量@PeterLawrey时,是的,我们不输入移位,因为1<0为假,所以我们使用1。
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR;
    threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
    table = new Entry[DEFAULT_INITIAL_CAPACITY];
    init();
}