为什么我必须在调用批量操作之前编写第一个语句?
Set<Type> union = new HashSet<Type>(s1);
union.addAll(s2);
答案 0 :(得分:7)
必须在调用方法之前实例化一个对象。
在这种情况下,尝试在addAll
对象上调用null
方法将导致NullPointerException
。因此,必须首先以某种方式构造Set
union
对象,然后才能以任何有意义的方式使用它。
我认为查看给定代码并尝试理解代码试图完成的内容是个好主意。
Set<Type> union = new HashSet<Type>(s1);
union.addAll(s2);
以上代码告诉我以下内容:
让我们从HashSet
Collection
的现有元素中创建一个新的s1
(我假设它与另一个Set
类似。)
新创建的HashSet
将存储为Set
,其名称为union
- 代码似乎暗示这个新的Set
将会代表某种联盟。
union
将Collection
方法添加来自另一个Set
(可能是另一个名为s2
的{{1}})的元素addAll
现在,我认为union
对象包含Set
s s1
和s2
的联合。
编写代码时,应注意尝试告诉别人代码打算做什么。让代码解释它正在做什么将导致更易读和可维护的代码,这将使其他人阅读和理解更容易(并且可能是一种乐趣)。
答案 1 :(得分:1)
如果您声明工会的容量设置为s1和s2的组合大小,则可以确保更优化的联合。
HashSet<Type> union = new HashSet<Type>(s1.size() + s2.size());
union.addAll( s1 );
union.addAll( s2 );
此外,您可以将此联合代码放入另一个实用程序类的静态方法中,以便所有调用代码只有一行
public abstract class Unionizer {
public static final HashSet<Type> union( HashSet<Type> s1, HashSet<Type> s2 ) {
HashSet<Type> union = new HashSet<Type>(s1.size() + s2.size());
union.addAll( s1 );
union.addAll( s2 );
return union;
}
}
现在,无论您需要将两个集合在一起,您只需键入:
HashSet<Type> union = Unionizer.union( s1, s2 );
答案 2 :(得分:0)
我相信你不需要复制另一套,但你需要调用new运算符。你可以:
Set<Type> union = new HashSet<Type>();
union.addAll(s2);
//and if you want s1 to be included too:
union.addAll(s1);
答案 3 :(得分:0)
如果您想更优雅地使用double brace initialization:
Set<Type> union = new HashSet<Type>() {{
addAll(s1);
addAll(s2);
}};