2012-01-24 7 views
0

我在我的android應用程序中出現奇怪的問題,我認爲它可能會鏈接到ArrayList工作方式的行爲。請檢查下面的代碼,並請告訴我,如果我正確或做錯了什麼:當在java中使用ArrayList <ArrayList <String>>時出現奇怪的結果

ArrayList<ArrayList<String>> arr = new ArrayList<ArrayList<String>>(); 
ArrayList<String> tmp = new ArrayList<String>(); 
tmp.add("test"); 
arr.add(tmp); 
tmp.clear(); 

最後一行ARR [0]的內容被清空後。那麼這是否意味着當向另一個ArrayList添加一個ArrayList時,它通過引用來完成它?

所以,如果我有以下方法:

void addArray(ArrayList<String> arr) { 
group.add(arr); // group is ArrayList<ArrayList<String>>; 
}; 

我必須將其更改爲:

void addArray(ArrayList<String> arr) { 
ArrayList<String> tmp = new ArrayList<String>(); 
tmp.addAll(arr); 
group.add(tmp); // group is ArrayList<ArrayList<String>>; 
}; 

,以確保如果我清除進入陣列別的地方沒有任何反應的組陣列?

+2

是的,ArrayList(和所有其他集合)只存儲對象的引用,它們不克隆或複製它們。 – Jens

回答

3

在Java中沒有值傳遞,每個對象都通過引用傳遞。所以在你的情況下,arr[0]tmp是相同的對象,清除它將導致arr[0]被清除。希望這可以幫助。

編輯

作爲一個快速的回答你問題的第二部分:你不需要使用tmpArrayListaddArray方法內。 addArray方法的參數是對對象的引用,通過值傳遞。所以改變它將不會在addArray方法之外產生任何效應。希望很清楚。

+2

這將是更確切的說,引用傳遞的價值:http://javadude.com/articles/passbyvalue.htm :) –

+0

@savinos,真的很好的文章,謝謝! – Egor

+0

謝謝。我假設如果我要調用「tmp = new ArrayList 」而不是「tmp.clear()」,會發生同樣的情況嗎? – stevovo

0

是的,對象在添加到集合時不會被克隆。

0

對於Java,Java始終傳遞引用值的副本,所以是的,您清除的ArrayList與添加到另一個ArrayList的ArrayList相同。

相關問題