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,一旦你添加了东西,就必须调整它的大小.
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.
这将把它设置为最小值.
很可能这用于关闭代码分析器,如果你没有为集合设置初始容量,它可能会抱怨.通过将其设置为0,您只需将其设置为最小值.
它不是一个优化,因为只要添加一个条目,0.7的加载因子将使容量2,Map.Entry[]在过程中重新创建.
| 归档时间: |
|
| 查看次数: |
7627 次 |
| 最近记录: |