Set<Type> union = new HashSet<Type>(s1);
和
Set<Type> union = new HashSet<Type>();
Set<Type> s1 = new HashSet<Type>();
union.addAll(s1);
答案 0 :(得分:7)
首先会更高效,因为第二个Set
将在后备数据结构中使用正确的空间量创建,其中第二段代码{{1必须调整大小以便为新元素腾出空间。
就最终结果而言,它们是相同的。
答案 1 :(得分:5)
假设Set
s1
在第一个和第二个例子中包含相同的内容,最终结果应该是相同的。
(但是,第二个例子不会编译,因为Set
是一个接口而不是一个具体的类。)
使用HashSet(Collection)
构造函数的一个优点是,它的初始容量足以容纳Collection
(在这种情况下,Set
s1
)传递给构造函数:
构造一个包含的新集合 指定集合中的元素。 默认情况下会创建
HashMap
载荷系数(0.75)和初始值 容量足以容纳 指定集合中的元素。
但是,使用HashSet()
构造函数,初始大小为16,因此如果通过Collection.addAll
添加的Set
大于16,则必须调整大小数据结构:
构造一个新的空集;该 后备
HashMap
实例具有默认值 初始容量(16)和负载系数 (0.75)。
因此,在性能和效率方面,使用HashSet(Collection)
构造函数创建HashSet
可能是更好的选择。
但是,从代码可读性的角度来看,变量名union
似乎意味着新创建的Set
是另一个Set
的联合,所以可能使用的是addAll
Set
方法是更容易理解的代码。
如果想法只是从现有的Set
创建新的newSet
,那么新创建的copyOfS1
应该以不同的名称命名,例如{{1}},{{1}}或类似的东西。
答案 2 :(得分:1)
没有区别。两者都将创建一个包含集合s1中所有元素的新集合。
当然,你的第二个代码示例甚至不会编译,因为你不能直接实例化Set
接口,但我假设你想说new HashSet
而不是{{ 1}}。
答案 3 :(得分:1)
有一点不同,因为新的HashSet(s1)将事先确保所有元素都适合,并且不需要重新散列。