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

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

Set users = new HashSet(); 

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

 Set users = new HashSet(0); 

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

默认初始容量为16 ,因此如果最终没有在集合中放入任何内容,则传入0可以节省几个字节的内存。

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

HashSet使用HashMap存储数据:

 public HashSet(int initialCapacity) { map = new HashMap(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[]

如果你看到文档

有一些线索。

迭代此集合需要的时间与HashSet实例的大小(元素数量)加上后备HashMap实例的“容量”(桶数)之和成比例。 因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。

HashMap的初始加载因子是16.当HashMap保存12个记录的数据时,它是其初始大小的75%。 然后HashMap增加了它的大小。

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