我有一个对象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的最后一个元素吗?
答案 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();