在java中,将每个元素添加到列表与仅将列表分配给另一个元素有什么区别
有人能告诉我把每个元素添加到一个列表和仅仅把一个列表分配给另一个列表之间的区别吗
//此构造函数未通过某些测试
public Assembler(List<Fragment> fragments) {
this.fragments = fragments;
}
//而此构造函数将传递所有这些
public Assembler(List<Fragment> fragments) {
for(int i = 0; i<fragments.size(); i++){
this.fragments.add(fragments.get(i));
}
}
# 1 楼答案
你的第一个例子:
在前一个示例中,您正在覆盖列表。任何使用在
this.fragments
中的元素现在不再在this.fragments
中,而是this.fragments
现在指向一个全新的列表这是否重要取决于
this.fragments
最初是如何声明的。这可能是因为它的声明方式已经包含了一些变量:在这种情况下,所有这些都将被覆盖。但对于实例变量来说,这是不寻常的行为
测试失败的另一个更可能的原因是引用——可能有一个测试在某个地方执行类似的操作:
在这种情况下,通过评估是否调用了相同的引用,可以明确地检查您是否只是复制了列表
类似地,如果你做了赋值操作,它可能会导致意外行为,比如在
fragments
中添加一个项,并让它显示在a.fragments
中,这可能也是不需要的在后一个示例中,您将添加到列表中:
这会保留对每个单独元素的引用,但不会重新分配
this.fragments
,这样即使在之后,fragments
和this.fragments
也会引用不同的对象,因此修改其中一个不会修改另一个不过,有一种比使用
for
循环更简洁的方法:# 2 楼答案
我创建了一个非常简单的方法,向您展示了差异。在第一种情况下,两个
List
引用同一个对象,因此修改一个将同时修改这两个对象。在第二个版本中,它们是分开的,因此修改一个不会修改另一个这将输出:
如您所见,当
Frag2
向原始List
添加一个值时,原始List
发生了更改,Frag1
和Frag2
都是相等的。然而,在使用第二种构造方法的String
中添加Frag3
不会影响Frag1
的原始值,并且与现在的Frag2
和Frag1
都不同