2013-10-24 152 views
2

我有一個對象mypath List<List<Object>> mypath = new ArrayList<List<Object>>();的二維列表。假設我有代碼Java Arraylist清除:清除()如何工作

mypath.add(temppath); 
    System.out.println("mypath: "+mypath.get(mypath.size()-1)); 
    temppath.clear(); 
    System.out.println("mypath: "+mypath.get(mypath.size()-1)); 

我看到第一個print語句對象的列表下面的行,但是從第二打印一個空列表。當我清除temppath時,似乎mypath的元素也被清除了。有沒有辦法規避這個問題?我可以清除temppath,而不清除mypath的最後一個元素嗎?

+0

添加TEMPPATH的副本而不是mypath中。 – George

+0

如果我通過執行temppath1 = temppath添加副本,那不起作用。 – rivu

+0

temppath == mypath,因此您要爲自己添加相同的列表。因此,你也清除'兩'' – Alistair

回答

4

,因爲兩者都指的是同一個Object堆,使它像

mypath.add(new ArrayList<Object>(temppath)); 

這將創建的temppath

副本,如果它是不會傷害到你的應用程序

5

當你向mypath添加temppath,不創建新對象,添加對現有對象的引用。因此,你對這個對象所做的一切都會反映到它所引用的任何地方。

此問題的一種可能的解決方案是創建temppath的副本並將其添加到mypath。

1

如果你想重用temppath不斷添加元素的新Listmypath,創造,而不是調用它clear()一個新的List實例。

// temppath.clear(); 
temppath = new ArrayList<Object>(); 

List#clear()給你一個List實例,你最終結算剛纔添加到mypath相同的列表。只能撥打clear()來處理元素。

0

Rivu,

您正在清理TEMPPATH,但不能從mypath中刪除它。因此,在第二次嘗試時,您再次提到temppath,這是空白的。

,如果你想刪除TEMPPATH使用

mypath.remove(temppath); 

代替

temppath.clear();