Java中的復(fù)制操作有兩種:深復(fù)制和淺復(fù)制。理解這兩種復(fù)制操作的區(qū)別對于編寫高質(zhì)量的Java代碼非常重要。以下是深復(fù)制和淺復(fù)制的詳細(xì)解釋。
淺復(fù)制
淺復(fù)制是一種創(chuàng)建新對象的方法,該對象具有與原始對象相同的原始值副本。但是,如果原始對象的某個字段是引用類型,則淺復(fù)制僅復(fù)制該字段的引用,而不是創(chuàng)建新的實例并將其分配給該字段。
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也會被改變
可以看到,雖然我們創(chuàng)建了一個新的Person對象,但person1和person2共享相同的List對象。所以,如果我們更改person1的hobbies,則person2的hobbies也會隨之更改。
深復(fù)制
深復(fù)制是一種創(chuàng)建新對象的方法,該對象具有原始對象及其任何松散引用的副本。這意味著如果原始對象的某個字段是引用類型,則深復(fù)制將創(chuàng)建該字段的新實例,并將其分配給新對象的相應(yīng)字段。
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對象。通過執(zhí)行深復(fù)制,我們可以確保我們的新對象是真正獨立的。