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

Set union = new HashSet(s1); 

 Set union = new HashSet(); Set s1 = new HashSet(); union.addAll(s1); 

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

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

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

构造一个包含指定集合中元素的新集合。 使用默认加载因子(0.75)创建HashMap ,初始容量足以包含指定集合中的元素。

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

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

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

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

如果想法只是从现有的Set创建一个新的Set ,那么新创建的Set应该以不同的名称命名,例如newSetcopyOfS1或其他类似的东西。

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

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

没有区别。 两者都将创建一个包含集合s1中所有元素的新集合。

当然,你的第二个代码示例甚至不会编译,因为你不能直接实例化Set接口,但我假设你想说new HashSet而不是new Set

有一点不同,因为新的HashSet(s1)将事先确保所有元素都适合,并且不需要重新散列。