java - 深度复制应该如何工作?

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

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

最佳答案

真正的深拷贝会创建引用树中所有内容的副本。

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

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

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

关于java - 深度复制应该如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12058890/

相关文章:

java - 禁用时如何使搜索栏变灰?

java - 字节数组到印地语 Unicode 值

java - Java 和 Spring 新手 - 我应该将学习重点放在哪些方面,以便能够快速使用 Spring 安全性?

java - 同步块(synchronized block)中的等待线程

java - 在 Java 中替换字符串中所有出现的 ";;"

部署前的 Java HotSpot 分析?

java - Groovy 模拟文件构造函数,验证写入新创建的文件

java - 创建类的实例并设置变量

java - 插入与 Hibernate 映射的存储过程

java - Espresso 图像选择器 - CursorIndexOutOfBoundsException 错误