为什么要将 HashSet<>(0) 初始化为零?
2022-09-02 03:28:35
我喜欢HashSet<>(),并在使用默认构造函数初始化它时热切地使用它:
Set<Users> users = new HashSet<>();
现在,我的自动bean创建器(JBoss工具)将其初始化为:
Set<Users> users = new HashSet<>(0);
为什么是零?API 告诉我这是初始容量,但将其归零有什么好处呢?这是建议的吗?
我喜欢HashSet<>(),并在使用默认构造函数初始化它时热切地使用它:
Set<Users> users = new HashSet<>();
现在,我的自动bean创建器(JBoss工具)将其初始化为:
Set<Users> users = new HashSet<>(0);
为什么是零?API 告诉我这是初始容量,但将其归零有什么好处呢?这是建议的吗?
默认的初始容量为 16,因此,如果最终未在集合中放入任何内容,则通过传入 0 可以节省几个字节的内存。
除此之外,没有真正的优势;当您超过0时,将创建容量为1的集合,并且一旦您添加某些内容,就必须调整其大小。
哈希集使用哈希映射存储数据:
public HashSet(int initialCapacity) {
map = new HashMap<E,Object>(initialCapacity);
}
而初始容量 = 0,
public HashMap(int initialCapacity, float loadFactor) {
....
// Find a power of 2 >= initialCapacity
int capacity = 1;
while (capacity < initialCapacity)
capacity <<= 1;
}
哈希映射容量为 。1
但如果使用默认构造函数:
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR;
threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);
table = new Entry[DEFAULT_INITIAL_CAPACITY];
init();
}
哈希映射容量为 。16*0.75
因此,在初始化时保存一些记忆。new HashSet<>(0)