Set<Type> union = new HashSet<Type>(s1);
union.addAll(s2);
和
Set <Type> union = new HashSet<Type>();
union.addAll(s1);
union.addAll(s2);
答案 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。