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

时间:2009-06-29 13:13:12

标签: java collections

Set<Type> union = new HashSet<Type>(s1);

Set<Type> union = new HashSet<Type>();
Set<Type> s1 = new HashSet<Type>();
union.addAll(s1);

4 个答案:

答案 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)将事先确保所有元素都适合,并且不需要重新散列。