在进行深拷贝时确定,显然不应复制引用。但是,如果被复制的对象包含的对象本身是对同一对象的引用,那么应该维护或者只复制数据。
例子
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/