淘先锋技术网

首页 1 2 3 4 5 6 7

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对象。通过执行深复制,我们可以确保我们的新对象是真正独立的。