从另一个列表创建一个列表并从复制列表中删除元素

时间:2013-08-28 21:34:13

标签: java list deep-copy shallow-copy

假设我有以下结构,我创建了一个这样的列表。 如果我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; 
}

2 个答案:

答案 0 :(得分:3)

是的,你的理解是正确的。 List newList = new ArrayList(collection);将执行浅层复制。您可以修改newList而不影响原始collection,但它们每个都会引用相同的元素,因此如果您修改一个列表中的元素,另一个列表的元素也将获得更改。

这称为浅拷贝。这是我所描述内容的直观表达:

enter image description here

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

答案 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
相关问题