从方法参数或引用创建新对象

时间:2014-07-27 07:55:38

标签: java

public setArrayList(List<Integer> list) {
    this.list = list;

    //OR

    this.list = new ArrayList<Integer>(list);
}

我见过不同的人可以互换使用这个代码。这两种实现之间有区别吗?

4 个答案:

答案 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,那么它将不会影响参数。