5Yr*_*DBA 25 java clone 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
并使用对相同对象的引用来填充它,这就是为什么从两个List
s 都可以看到对象的更改.使用克隆方法,您的代码将如下所示:
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 copy
的List
.在此上下文中,浅表副本创建一个新List
实例,但包含对原始对象的引用.
Luc*_*cky 18
如果要将可变对象存储到ArrayList中,则需要在复制ArrayList时复制每个对象.否则,新的ArrayList仍将保留原始引用.
但是,如果您要存储不可变对象,则可以使用:
ArrayList copiedInvoice = new ArrayList(originalInvoice);