java - 如何在java中深度克隆包含多个对象的对象列表?

标签 java clone deep-copy

假设有一个 EmployeeList,其中包含 5 个 Employee 对象。

我想执行该 EmployeeList 的克隆以创建一个新的 EmployeeList,我想知道应该如何做?

所以以下是我的类(class) Employee:

public class Employee {
private String name;
private String ssn;
private double salary;

private String name() {
    return name;
}

private void name(String name) {
    this.name = name;
}

private String ssn() {
    return ssn;
}

private void ssn(String ssn) {
    this.ssn = ssn;
}

private double salary() {
    return salary;
}

private void salary(double salary) {
    this.salary = salary;
}

void initialize(String initName, String initSsn, double initSalary) {
    this.name(initName);
    this.ssn(initSsn);
    this.salary(initSalary);
}

public Employee(String name, String ssn, double salary) {
    this.initialize(name, ssn, salary);
}

public Employee clone() {
    return new Employee(this.name, this.ssn, this.salary);
}
}

以下是我的类(class) EmployeeList:

public class EmployeeList implements Cloneable {
private Employee[] list;
private int MAX = 5;

public EmployeeList() {
    list = new Employee[MAX];
    for (int i = 0; i < MAX; i++)
        list[i] = null;
}

public void add(Employee employee) {
    list[count] = employee;
}

public Object clone() {
    try {
        return super.clone();
    } catch (CloneNotSupportedException c) {
        System.out.println(c);
        return null;
    }
}   
}

我缩短了代码,以便更容易查看。

我的问题是:

当我执行复制时,我认为它复制了带有指向原始 Employee 对象的指针的 EmployeeList。因为当我更改原始对象时,新列表中的对象也会更改

我可以解决这个问题吗?

非常感谢。

最佳答案

是的,它确实按照你的想法做了 - 它克隆了你的数组,包括它的值。在这种情况下,数组值是指向 Employee 实例的指针,因此您得到了指向相同雇员的第二个数组。它称为浅复制。如果你想要完整的副本,你需要类似的东西

public Object clone() {
    try {
        EmployeeList copy = (EmployeeList) super.clone();
        if (list!=null) {
            copy.list = new Employee[list.length];
            for (int i=0; i<list.length; i++) {
                copy.list[i] = (Employee)list[i].clone();
            }
        } else {
            copy.list = null;
        }
        return copy;
    } catch (CloneNotSupportedException c) {
        System.out.println(c);
        return null;
    }
}

您还需要使 Employee 可克隆。 通常,当您处理对象图时,每个对象的 clone() 方法都需要递归地克隆其数据成员,直到您遇到基元(例如 double )或不可变类(一旦构造就无法更改的类 -就像您的情况中的String)

关于java - 如何在java中深度克隆包含多个对象的对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14795199/

相关文章:

java - Java VisualVM 中的总方法时间

java - 为什么 java.lang.Cloneable 没有覆盖 java.lang.Object 中的 clone() 方法?

java - 您能解释一下这些说法吗?

java - 有没有一种方法可以让这个程序在执行循环的一部分后重新开始

clone - 基于现有数据库创建新的 rrd 数据库

c# - 在 C# 中创建深拷贝

python - 自定义类实例复制

Java,这是深拷贝吗?

java - Servlet 读取/输出二进制文件也不与原始文件相同的校验和

java - 克隆需要澄清 : Shallow copying of objects is NOT just assigning object reference variable to another variable or is it?