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

原文 标签 java

OK,当做深拷贝时,显然不应该拷贝引用。但是,如果被复制的对象包含本身是对同一对象的引用的对象,则应维护该对象还是仅复制数据。

例子

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 - 如何在不包含IDE的计算机上运行Java程序?

java - JTextField不起作用,但JLabel起作用吗?

java - Glide 没有从 Firebase 加载图像

java - 为什么我们调用Object.clone()方法?

java - 同时使用 ActiveMQ 和 RabbitMQ

java - 如何使用 Selenium 在表中的文本字段组中输入值

java - 有人可以解释什么是虚拟机以及它们为什么有用吗?

java - 全局布局监听器返回0

java - 如何使用 Spring Data JPA 将列的新旧值保存到审计表中

java - 方法内的方法替换 boolean 语句