深层复制应该如何工作?

bay*_*ezy 6 java

在执行深层复制时,显然不应复制引用.但是,如果要复制的对象包含自身引用同一对象的对象,则应该维护这些对象,或者是否应该复制数据.

public class Program() {
    public void Main(String[] args) {
        Person person = new Person();
        person.setName("Simon");

        List<Person> people = new ArrayList<Person>();
        people.add(person);
        people.add(person);
        people.add(person);

        List<Person> otherPeople = magicDeepCopyFunction(people);

        otherPeople.get(0).setName("Adam");

        // should this output 'Adam' or 'Simon'?
        System.out.println(otherPeople.get(1)); 
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以看到两者的论点,但我想知道共识是什么.

sli*_*lim 3

真正的深层复制会创建引用树中所有内容的副本。

如果 B 是 A 的深层副本,则您对 A 所做的任何更改都不会通过B 可见。

大多数深度复制算法不会注意到在您的示例中, 的所有三个成员people都是对同一person. 典型的深度复制算法会创建三个新的 Person 对象。

然而,真正的深拷贝并不常见,因为它很难可靠地编程(除了非常严格定义的数据结构),而且运行时成本高昂。