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
ss1
和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 );