Java Arraylist clearing:clear()的工作原理

时间:2013-10-24 22:49:36

标签: java arraylist

我有一个对象mypath List<List<Object>> mypath = new ArrayList<List<Object>>();的2D列表。假设我有以下代码行

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

我从第一个print语句中看到一个对象列表,但是从第二个print中看到一个空列表。当我清除temppath时,mypath的元素也会被清除。有办法解决这个问题吗?我可以清除temppath,而不清除mypath的最后一个元素吗?

4 个答案:

答案 0 :(得分:5)

将mypath添加到mypath时,如果不创建新对象,则添加对现有对象的引用。因此,您对此对象所做的一切都将反映在引用它的任何位置。

此问题的一种可能解决方案是创建temppath的副本并将其添加到mypath。

答案 1 :(得分:4)

因为两者都在堆中引用相同的Object,所以就像

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

这将创建temppath

的副本

如果它对您的应用无害

答案 2 :(得分:1)

如果您尝试重复temppath以继续向List添加新的mypath元素,请创建新的List实例,而不是调用clear()在它上面。

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

List#clear() 为您提供新的 List实例,并最终清除您刚添加到mypath的同一列表}。只需调用clear()即可处置元素。

答案 3 :(得分:0)

Rivu,

您正在清除temppath,但不会将其从mypath中删除。因此,在第二次尝试时,您再次引用temppath,这是空白的。

如果要删除temppath使用

mypath.remove(temppath);

而不是

temppath.clear();