深层复制应该如何工作?

时间:2012-08-21 16:06:11

标签: 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)); 
    }
}

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

3 个答案:

答案 0 :(得分:3)

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

如果B是A的深层副本,则您对A所做的任何更改都将通过B显示而不是

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

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

答案 1 :(得分:2)

这取决于您对数据结构如何工作的期望。

通常,您可以使引用与原始引用一样常见。也就是说它应该假设你有两个对同一个对象的引用是有充分理由的。您不应该期望它为同一个对象制作两个副本,以解决不正确的数据结构。

答案 2 :(得分:2)

Simon的

+1 如果我看到了magicDeepCopyFunction()的调用,我会期待真正的深层复制。它更具防御性,更难实现,因为可能存在另一个级别的关系,周期等。这实际上取决于你想要做什么,但如果你调用方法深层复制,其他人可以将它用作黑盒子没有任何风险。