2013-11-04 51 views
-1
ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); 
ArrayList<Integer> tmp = new ArrayList<Integer>(); 

tmp.add(1); 
tmp.add(2); 
tmp.add(3); 
res.add(tmp); 

一個對象,然後我需要修改TMP:取消引用的Java

tmp.remove(tmp.size() - 1); 

如何修改一無所有的TMP在res變化?因爲如果我以這種方式修改tmp,res中的內容也會被修改。我認爲這與Java中的解除引用有關,也許是一個非常常見和重要的問題,那麼有人可以幫助我嗎?

回答

2

要獨自離開老ArrayListcopy the existing ArrayList並將其分配給tmp

tmp = new ArrayList<Integer>(tmp); 

現在你可以在列表的副本進行工作,而不會影響舊列表。

+0

那麼,這種拷貝是深拷貝還是淺拷貝? – Spark8006

+0

這是一個淺拷貝。 – rgettman

+0

謝謝,所以這裏的想法是,而不是把一個參考Arraylist,只是創建一個副本,並把它放在那裏,對嗎? – Spark8006

1

您正在尋找

res.add(new ArrayList<Integer>(tmp)); 

的想法是創建對象的副本,而不是用在多個地方相同的參考。

1

你必須做的List的副本,並存儲複製res

res.add(new ArrayList<Integer>(tmp));

只要記住,雖然清單是一個副本,在列表中的對象是相同。因此,如果您對一個列表中的對象進行更改,副本中的對象也將被更改。除非你做了原始列表的深層副本。