java - 如何制作 ArrayList 的单独副本?

标签 java arraylist clone

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/

相关文章:

java - 在哪里放置 Maven 构建库的演示/示例代码?

java - 如何删除 JavaFX 应用程序中的标准 Windows 菜单?

java - 如何修改通过 void 方法传递的变量(必须为 void)并更改方法外部的值 (Java)

android - 如何组合两个数组列表并在android中的 ListView 中显示

java - Java 中克隆列表元素

java - 是否有静态分析工具可以自动检查 Java 项目中的竞争条件?

java - Subclipse 安装失败 "Subversion native library not available"(Java HL)

java - 在 Java 中迭代 Map

git - 如何使用git只获取提交历史,而不是文件

sorting - 如何按属性对对象进行排序?