这两组陈述之间是否有任何区别

时间:2009-06-30 18:25:03

标签: java collections

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

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

6 个答案:

答案 0 :(得分:2)

这里的差异远远小于你之前的问题 第一种方式应该更快,因为原始Set不必增长太多。

您可能希望这样做:

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

这样您根本不必调整新Set的大小。 (即使你可能有一些额外的空间)

答案 1 :(得分:1)

以编程方式还是逻辑方式?

最后你会得到同样的收藏品。

答案 2 :(得分:1)

我会选择第二种形式,因为它更清晰。更容易看出这是向Set添加两个东西,因为它是显式的。使用两种不同的方法将事物置于Set中会混淆两次执行相同操作的事实。

答案 3 :(得分:0)

第一个版本可能更有效率,因为它分配了足够的空间来包含s1的元素。

答案 4 :(得分:0)

从Java 6源代码中,我们可以看到构造函数在初始化集合大小后实际调用了addAll:

public HashSet(Collection<? extends E> c) {
    map = new HashMap<E,Object>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

请注意,这会增加至少1/3的额外容量,因此如果s2较小或者您希望两组中有相当数量的交叉值,则可能足够好。

否则,所有其他答案都有意义!

答案 5 :(得分:0)

这取决于你的两套的大小。

(方法1)
第一种方式是:

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

这需要3个语句,并且不保证最初足够大以容纳所有元素。默认的后备存储是16个元素。如果在s1和s2之间有超过16个元素,则调用不带参数的构造函数效率会降低,因为它必须创建一个足以容纳s1和s2的新后备存储。

(方法2)
如果你说:

Set union = new HashSet(s1.size() + s2.size());
union.addAll(s1);
union.addAll(s2);

您将获得一套可容纳所有物品的套装,但这也需要3份陈述。

(方法3)
如果使用Set创建新的HashSet,则它将分配该集合大小的两倍。 (Java api link)所以,如果s1大于s2,你可以说:

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

你只需要2个陈述。

如果您提前知道哪个集合会更大,请使用方法#3,但如果不这样做,请使用方法#2。