这两组陈述之间的确切区别是什么?
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
应该以不同的名称命名,例如newSet
, copyOfS1
或其他类似的东西。
第一个将更有效,因为第二个Set
将在后备数据结构中使用正确的空间量创建,在第二段代码中, Set
必须resize以便为新元素腾出空间。
就最终结果而言,它们是相同的。
没有区别。 两者都将创建一个包含集合s1中所有元素的新集合。
当然,你的第二个代码示例甚至不会编译,因为你不能直接实例化Set
接口,但我假设你想说new HashSet
而不是new Set
。
有一点不同,因为新的HashSet(s1)将事先确保所有元素都适合,并且不需要重新散列。