Java 为什么在调用相应的批量操作之前必须复制一个集合?

Java 为什么在调用相应的批量操作之前必须复制一个集合?,java,Java,为什么我必须在调用批量操作之前编写第一条语句 Set<Type> union = new HashSet<Type>(s1); union.addAll(s2); Set union=newhashset(s1); union.addAll(s2); 在调用方法之前,必须实例化对象 在这种情况下,尝试对null对象调用addAll方法将导致NullPointerException。因此,必须首先以某种方式构造集合

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

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

在调用方法之前,必须实例化对象

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


我认为检查给定的代码并尝试理解代码试图实现什么是一个好主意

Set<Type> union = new HashSet<Type>(s1);
union.addAll(s2);
Set union=newhashset(s1);
union.addAll(s2);
上面的代码告诉我:

  • 让我们从
    集合
    s1
    的现有元素中创建一个新的
    哈希集
    (我假设它类似于另一个

  • 新创建的
    HashSet
    将存储为名为
    union
    Set
    ——该代码似乎暗示这个新的
    Set
    将表示某种类型的联合

  • 将通过
    addAll
    方法将另一个
    集合
    (可能是另一个名为
    s2
    集合
    )中的元素添加到
    联合

  • 现在,我认为
    union
    对象包含
    Set
    s
    s1
    s2
    的并集


  • 在编写代码时,应该注意告诉他人代码的意图。让代码解释它在做什么将导致更可读和可维护的代码,这将使其他人更容易阅读和理解(可能是一种乐趣)。

    我相信您不需要复制另一个集合,但您需要调用新的操作符。你可以:

    Set<Type> union = new HashSet<Type>();
    union.addAll(s2);
    //and if you want s1 to be included too:
    union.addAll(s1);
    
    Set union=newhashset();
    union.addAll(s2);
    //如果您希望s1也包括在内:
    union.addAll(s1);
    
    如果您想更优雅地完成此操作,请使用:

    Set union=newhashset(){{
    addAll(s1);
    addAll(s2);
    }};
    
    如果将接头集的容量声明为s1和s2的组合大小,则可以确保接头更为优化

    HashSet<Type> union = new HashSet<Type>(s1.size() + s2.size());
    union.addAll( s1 );
    union.addAll( s2 );
    
    HashSet union=新的HashSet(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;
        }
    }
    
    公共抽象类联合器{
    公共静态最终哈希集联合(哈希集s1、哈希集s2){
    HashSet union=新的HashSet(s1.size()+s2.size());
    union.addAll(s1);
    union.addAll(s2);
    回归联盟;
    }
    }
    
    现在,只要将两个集合合并在一起,您只需键入:

    HashSet<Type> union = Unionizer.union( s1, s2 );
    
    HashSet union=Unionizer.union(s1,s2);
    
    你为什么不把第一个集合作为construcotr参数呢?这并不优雅——在我看来,这是一个可怕的滥用。你相信还是确定/
    HashSet<Type> union = Unionizer.union( s1, s2 );