Java中的复制操作有两种:深复制和浅复制。理解这两种复制操作的区别对于编写高质量的Java代码非常重要。以下是深复制和浅复制的详细解释。
浅复制
浅复制是一种创建新对象的方法,该对象具有与原始对象相同的原始值副本。但是,如果原始对象的某个字段是引用类型,则浅复制仅复制该字段的引用,而不是创建新的实例并将其分配给该字段。
public class Person {
private String name;
private List<String> hobbies;
public Person(String name, List<String> hobbies) {
this.name = name;
this.hobbies = hobbies;
}
public List<String> getHobbies() {
return hobbies;
}
}
Person person1 = new Person("张三", Arrays.asList("篮球", "音乐", "旅游"));
Person person2 = new Person(person1.getName(), person1.getHobbies());
person1.getHobbies().add("美食"); // 改变person1中的hobbies
System.out.println(person2.getHobbies()); // person2的hobbies也会被改变
可以看到,虽然我们创建了一个新的Person对象,但person1和person2共享相同的List对象。所以,如果我们更改person1的hobbies,则person2的hobbies也会随之更改。
深复制
深复制是一种创建新对象的方法,该对象具有原始对象及其任何松散引用的副本。这意味着如果原始对象的某个字段是引用类型,则深复制将创建该字段的新实例,并将其分配给新对象的相应字段。
public class Person {
private String name;
private List<String> hobbies;
public Person(String name, List<String> hobbies) {
this.name = name;
this.hobbies = new ArrayList<>(hobbies);
}
public List<String> getHobbies() {
return new ArrayList<>(hobbies);
}
}
Person person1 = new Person("张三", Arrays.asList("篮球", "音乐", "旅游"));
Person person2 = new Person(person1.getName(), person1.getHobbies());
person1.getHobbies().add("美食"); // 改变person1中的hobbies
System.out.println(person2.getHobbies()); // 输出:[篮球, 音乐, 旅游]
可以看到,尽管我们更改了person1的hobbies,但person2的hobbies保持不变,因为它们共享不同的List对象。通过执行深复制,我们可以确保我们的新对象是真正独立的。