Possible Duplicate:
Java: how to clone ArrayList but also clone its items?
我有一个如下示例程序:
ArrayList<Invoice> orginalInvoice = new ArrayList<Invoice>();
//add some items into it here
ArrayList<Invoice> copiedInvoice = new ArrayList<Invoice>();
copiedInvoice.addAll(orginalInvoice);
我想我可以修改 copiedInvoice
中的项目,它不会影响 originalInoice
中的这些项目。但是我错了。
如何制作一个 ArrayList
的单独副本/克隆?
谢谢
最佳答案
是的,这是正确的 - 您需要实现 clone()
(或其他合适的机制来复制您的对象,因为 clone()
被许多程序员认为是“损坏的” )。您的 clone()
方法应该执行对象内所有可变字段的深层复制。这样,对克隆对象的修改不会影响原始对象。
在您的示例代码中,您将创建第二个 ArrayList
并使用 对相同对象的引用 填充它,这就是为什么对对象的更改可以从两个 列表
。使用克隆方法,您的代码将如下所示:
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());
}
EDIT:澄清一下,上面的代码是对原始 List
执行 深拷贝,而新的 List
包含对原始对象副本的引用。这与调用 ArrayList.clone()
形成对比,后者执行 List
的 浅拷贝
。在这种情况下,浅拷贝会创建一个新的 List
实例,但包含对原始对象的引用。
关于java - 如何制作 ArrayList 的单独副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1330288/