为什么我们必须在调用适当的批量操作之前复制一组?

时间:2009-06-29 13:35:52

标签: java

为什么我必须在调用批量操作之前编写第一个语句?

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

4 个答案:

答案 0 :(得分:7)

必须在调用方法之前实例化一个对象。

在这种情况下,尝试在addAll对象上调用null方法将导致NullPointerException。因此,必须首先以某种方式构造Set union对象,然后才能以任何有意义的方式使用它。


我认为查看给定代码并尝试理解代码试图完成的内容是个好主意。

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

以上代码告诉我以下内容:

  1. 让我们从HashSet Collection的现有元素中创建一个新的s1(我假设它与另一个Set类似。)

  2. 新创建的HashSet将存储为Set,其名称为union - 代码似乎暗示这个新的Set将会代表某种联盟。

  3. unionCollection方法添加来自另一个Set(可能是另一个名为s2的{​​{1}})的元素addAll

  4. 现在,我认为union对象包含Set s s1s2的联合。

  5. 编写代码时,应注意尝试告诉别人代码打算做什么。让代码解释它正在做什么将导致更易读和可维护的代码,这将使其他人阅读和理解更容易(并且可能是一种乐趣)。

答案 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);
}};