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并使用对相同对象的引用来填充它,这就是为什么从两个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 copy的List.在此上下文中,浅表副本创建一个新List实例,但包含对原始对象的引用.
Luc*_*cky 18
如果要将可变对象存储到ArrayList中,则需要在复制ArrayList时复制每个对象.否则,新的ArrayList仍将保留原始引用.
但是,如果您要存储不可变对象,则可以使用:
ArrayList copiedInvoice = new ArrayList(originalInvoice);
| 归档时间: |
|
| 查看次数: |
66156 次 |
| 最近记录: |