如何制作ArrayList的分离副本?

5Yr*_*DBA 25 java clone arraylist

可能重复:
Java:如何克隆ArrayList但也克隆其项目?

我有一个示例程序,如下所示:

ArrayList<Invoice> orginalInvoice = new ArrayList<Invoice>();

//add some items into it here

ArrayList<Invoice> copiedInvoice = new ArrayList<Invoice>();

copiedInvoice.addAll(orginalInvoice);
Run Code Online (Sandbox Code Playgroud)


我以为我可以修改里面的物品copiedInvoice,它不会影响里面的这些物品originalInoice.但是我错了.

如何分离复制/克隆ArrayList

谢谢

Ada*_*ski 39

是的,这是正确的 - 您需要实现clone()(或其他合适的机制来复制您的对象,因为clone()被许多程序员认为是"破坏").您的clone()方法应该对对象中的所有可变字段执行深层复制.这样,对克隆对象的修改不会影响原始对象.

在您的示例代码中,您将创建第二个ArrayList并使用对相同对象的引用来填充它,这就是为什么从两个Lists 都可以看到对象的更改.使用克隆方法,您的代码将如下所示:

List<Foo> originalList = ...;

// Create new List with same capacity as original (for efficiency).
List<Foo> copy = new ArrayList<Foo>(originalList.size());

for (Foo foo: originalList) {
  copy.add((Foo)foo.clone());
}
Run Code Online (Sandbox Code Playgroud)

编辑:为了澄清,上面的代码正在执行原始的深层复制,List其中新的List包含对原始对象的副本的引用.与此相反调用ArrayList.clone(),它执行shallow copyList.在此上下文中,浅表副本创建一个新List实例,但包含对原始对象的引用.

  • 为什么选择downvote? (3认同)
  • 错误:克隆在 java.lang.object 中具有“受保护”访问权限。 (2认同)

Luc*_*cky 18

如果要将可变对象存储到ArrayList中,则需要在复制ArrayList时复制每个对象.否则,新的ArrayList仍将保留原始引用.

但是,如果您要存储不可变对象,则可以使用:

ArrayList copiedInvoice = new ArrayList(originalInvoice);