2011-10-28 32 views
19

當調用list.addAll(list2)時,列表中的對象是否會被複制到列表中?或只是複製他們的參考...沒有找到任何javadoc的解釋...Java中將addAll函數複製

回答

29

沒有對象或其數據的副本;他們的引用被簡單地添加到列表對象中。

+0

那麼,如果我們稍後將一個元素添加到'list2'中會發生什麼?它會自動添加到'list'嗎? – iamprem

+0

不,當然不是。 –

+0

意思是如果我修改了'list2'中的一個元素,那麼我會看到輸出'list'的修改權? –

4

不,對象不會被複制;對相同對象的引用將被添加到列表中。

+0

但合同是否強制執行?我看到ArrayList以淺拷貝實現addAll(),但文檔中沒有規範。 –

+2

@ZiyaoWei它聲明它「追加所有元素」,所以這就是它會做的 - 追加所有元素。元素的副本不是元素,而是副本。 –

+0

@ZiyaoWei:沒有通用的方法來複制Java中的對象:沒有像C++那樣自動生成拷貝構造函數,clone()方法由很少的類支持。因此,一個容器*想要*複製其所有元素將發現自己無法這樣做。 –

3

一般來說,當你「添加全部」時,java不會複製對象,也就是說,對於對象,使用指向原件的指針。

*但要小心!對於字符串,由於不變性,數組副本不會指向原始字符串值,並且不能指望將指針更改爲添加到數組列表的字符串將導致新值。

+0

你將如何複製和添加所有? – Jacolack