[英]Creating new object from method argument or referencing instead
public setArrayList(List<Integer> list) {
this.list = list;
//OR
this.list = new ArrayList<Integer>(list);
}
我看到不同的人可以交替使用此代碼。 這兩種實現之間有區別嗎?
這個
this.list = list;
不會創建任何內容(或者,它會創建參數list
保存的引用的值的副本)。 它為變量分配一個值。
這個
this.list = new ArrayList<Integer>(list);
調用ArrayList
的構造函數,並傳遞List
類型的值作為參數。 然后,將構造函數調用的結果值分配給變量。
是的-這兩個示例在功能上有所不同。
public setArrayList(List<Integer> list) {
this.list = list;
}
這會將當前類的list
成員分配給與傳入列表相同的對象實例 。向列表中添加元素或從列表中刪除元素將影響原始列表。
this.list = new ArrayList<Integer>(list);
這將創建列表的新實例 ,並復制原始實例中的元素。 從此新列表中添加和刪除元素不會影響原始列表。
這兩種實現之間有區別嗎?
是,有一點不同。 在第一個示例( 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.
是的,兩者都有區別。 在第一個中,而不是創建列表的新對象時,它將引用該對象。因此,每當列表更改時,它也會在傳遞的列表中更改。 在第二篇中,它創建了新對象,因此,如果我們修改(添加/刪除元素)this.list,那么它將不會影響參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.