public setArrayList(List<Integer> list) {
this.list = list;
//OR
this.list = new ArrayList<Integer>(list);
}
我见过不同的人可以互换使用这个代码。这两种实现之间有区别吗?
答案 0 :(得分:2)
这个
this.list = list;
不会创建任何内容(或者更确切地说,它会创建参数list
所持有的引用值的副本)。它为变量赋值。
这个
this.list = new ArrayList<Integer>(list);
调用the constructor of ArrayList
passing a value of type List
as an argument.然后将构造函数调用的结果值赋给变量。
答案 1 :(得分:2)
是的 - 这两个例子在功能上是不同的。
public setArrayList(List<Integer> list) {
this.list = list;
}
这会将当前类的list
成员分配给相同的对象实例作为传入的列表。在列表中添加和删除元素将影响原始列表
this.list = new ArrayList<Integer>(list);
这将创建列表的新实例,从原始元素中复制元素。添加和删除此新列表中的元素不会影响原始列表。
答案 2 :(得分:1)
这两种实现有区别吗?
是的,有区别。在第一个示例(this.list = list;
)中,此Object引用与调用者相同的List
。在第二个示例中,创建了一个新列表。此列表独立于呼叫者。考虑,
List<Integer> al = new ArrayList<>();
// ...
Foo f = new Foo();
f.setArrayList(al);
al.clear(); // <-- the first example would empty f's list, the second wouldn't.
答案 3 :(得分:1)
是的,这两者都有区别。 在第一个而不是创建新的列表对象时,它将参考该对象。因此,每当列表被更改时,它也会在传递列表中更改。 在第二个中,它创建了新对象,因此如果我们修改(添加/删除元素)this.list,那么它将不会影响参数。