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

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

Set<Users> users = new HashSet<>();

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

Set<Users> users = new HashSet<>(0);

为什么是?API 告诉我这是初始容量,但将其归零有什么好处呢?这是建议的吗?


答案 1

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

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


答案 2

哈希集使用哈希映射存储数据:

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)