这两组陈述之间的确切区别是什么?

Joh*_*nna 3 java collections

Set<Type> union = new HashSet<Type>(s1);
Run Code Online (Sandbox Code Playgroud)

Set<Type> union = new HashSet<Type>();
Set<Type> s1 = new HashSet<Type>();
union.addAll(s1);
Run Code Online (Sandbox Code Playgroud)

jjn*_*guy 7

一个将更有效,因为第二个Set将在后备数据结构中使用正确的空间量创建,在第二段代码中,Set将必须调整大小以为新元素腾出空间.

就最终结果而言,它们是相同的.


coo*_*ird 5

假设Set s1在第一个和第二个例子中包含相同的内容,最终结果应该是相同的.

(但是,第二个示例不会编译,因为a Set是接口而不是具体类.)

使用HashSet(Collection)构造函数的一个优点是它的初始容量足以容纳传递给构造函数的Collection(在本例中为Set s1):

构造一个包含指定集合中元素的新集合.的HashMap与默认负载因数(0.75)和初始容量足以容纳指定集合中的元素创建的.

但是,使用HashSet()构造函数时,初始大小为16,因此如果Set通过Collection.addAll大于16 添加的大小,则必须调整数据结构的大小:

构造一个新的空集; 后备HashMap实例具有默认初始容量(16)和加载因子(0.75).

因此,在性能和效率方面,使用HashSet(Collection)构造函数创建HashSet可能是更好的选择.

但是,从代码的可读性的角度来看,变量名union似乎暗示新创建的Set是另一个的并集Set,因此使用该addAll方法的那个可能是更易理解的代码.

如果想法只是Set从现有的创建一个新的,那么新创建的Set应该可能以不同的名称命名,例如newSet,copyOfS1或者那种效果.