假设我有以下结构,我创建了一个这样的列表。
如果我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 :(得分:3)
是的,你的理解是正确的。 List newList = new ArrayList(collection);
将执行浅层复制。您可以修改newList
而不影响原始collection
,但它们每个都会引用相同的元素,因此如果您修改一个列表中的元素,另一个列表的元素也将获得更改。
这称为浅拷贝。这是我所描述内容的直观表达:
底部的东西是数组中的对象。
答案 1 :(得分: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