簡體   English   中英

從方法參數創建新對象或引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM