2

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

  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 的那个元素也会被清除。有没有办法绕过这个问题?我可以在不清除 mypath 的最后一个元素的情况下清除 temppath 吗?

4

4 回答 4

5

当您将 temppath 添加到 mypath 时,您不会创建新对象,而是添加对现有对象的引用。因此,您对这个对象所做的一切都会反映在它被引用的任何地方。

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

于 2013-10-24T22:55:28.227 回答
4

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

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

这将创建temppath

如果它对您的应用无害

于 2013-10-24T22:55:16.043 回答
1

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

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

List#clear()不会你一个 List的实例,你最终会清除你刚刚添加到的同一个列表mypath。只调用clear()dispose 元素。

于 2013-10-24T22:56:39.707 回答
0

里武,

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

如果你想删除 temppath 使用

mypath.remove(temppath);

代替

temppath.clear();
于 2013-10-24T23:08:31.457 回答