2013-08-28 114 views
1

假设我有以下结构,并且我创建了一个像这样的列表。 如果我做temp.remove(0)它不会影响原始列表,但temp.get(0).vars.remove(0)也会删除原始列表中的元素。从另一个列表创建一个列表并从复制列表中删除元素

我认为new ArrayList(top.mids)是不是做了深层复制然后temp.remove(0)怎么不影响原始列表?

//Top class init part and adding elements are omitted 
List<Mid> temp = new ArrayList(top.mids); 
temp.remove(0); 
temp.get(0).bots.remove(0); 


public class Top{ 
    List<Mid> mids = new ArrayList<Mid>(); 
} 

public class Mid{ 
    List<Bot> bots = new ArrayList<Bot>(); 

} 

public class Bot{ 
    int id; 
} 
+0

'新的ArrayList(top.mids)'是复制的'top.mids'一切到一个新的'ArrayList'。从这个列表中删除并不意味着从'top.mids'中删除。如果您要修改列表中的元素,那些更改将反映在'top.mids'中,因为它们引用了相同的对象。 –

回答

4

是的,你的理解是正确的。 List newList = new ArrayList(collection);将做一个浅拷贝。您可以在不影响原始collection的情况下修改newList,但它们将分别引用相同的元素,因此如果您修改一个列表中的元素,另一个列表的元素也会得到更改。

这被称为浅拷贝。下面是我所描述的可视表示:

enter image description here

底部的东西是你的数组中的对象。

1

声明

新的ArrayList(top.mids)是不是做一个深拷贝

指的是,当你确实有包含旧的所有项目一个新的列表列表中,新列表中的项目与旧列表中的内存实例相同。

这意味着虽然您可以修改新列表的内容(即对对象的引用)而不会对旧列表产生任何影响,但修改列表中的对象时也会通过旧列表访问它们。

为了更清楚我想去一个例子:

List<X> oldList = Arrays.asList(new X("1"), new X("2")); 
List<X> newList = new ArrayList<X>(oldList); 

newList.remove(0); 
System.out.println(newList.size()); // Prints 1 
System.out.println(oldList.size()); // Prints 2 

System.out.println(oldList.get(1).getValue()); // Prints 2 
newList.get(0).setValue("3"); 
System.out.println(oldList.get(1).getValue()); // Prints 3 
相关问题