Java中的拷貝分為淺拷貝和深拷貝兩種,它們的實現方式各不相同。
關于淺拷貝,它只會拷貝對象的基本數據類型以及引用類型的地址,而不是引用類型的對象本身。這意味著在進行對象操作時,可能會影響到原始對象。
// 淺拷貝實現代碼 public class Person implements Cloneable { private String name; private Listhobbies; public Person(String name, List hobbies) { this.name = name; this.hobbies = hobbies; } public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); } } // 淺拷貝調用 Person p1 = new Person("Tom", new ArrayList<>()); Person p2 = p1.clone(); p2.getHobbies().add("swimming"); System.out.println(p1.getHobbies()); // [swimming]
深拷貝就不存在上面提到的問題,它會將引用類型的對象也進行復制,這樣操作復制對象時就不會影響到原始對象了。
// 深拷貝實現代碼 public class Person implements Cloneable { private String name; private Listhobbies; public Person(String name, List hobbies) { this.name = name; this.hobbies = hobbies; } public Person clone() throws CloneNotSupportedException { Person person = (Person) super.clone(); person.hobbies = new ArrayList<>(hobbies); return person; } } // 深拷貝調用 Person p1 = new Person("Tom", new ArrayList<>()); Person p2 = p1.clone(); p2.getHobbies().add("swimming"); System.out.println(p1.getHobbies()); // []
總之,在Java中實現淺拷貝和深拷貝都需要實現Cloneable接口,并重寫clone()方法。深拷貝的關鍵在于需要將引用類型的對象也進行復制,而這一點淺拷貝是做不到的。