Java作為面向對象語言,對象之間的拷貝操作是非常常見的。Java中的拷貝操作可以分為深拷貝和淺拷貝。它們在實現上有著不同的特點和應用場景。
淺拷貝
淺拷貝是指將一個對象的引用復制給一個新的對象。
public class Person { private int age; private String name; //getters and setters } Person p1 = new Person(); p1.setAge(20); p1.setName("Tom"); Person p2 = p1;//淺拷貝
在代碼中,我們將p1的引用賦值給p2,這是一種淺拷貝。此時,p1和p2指向的是同一個對象,修改p1的屬性值也會影響到p2。
深拷貝
深拷貝是指復制對象及其引用的子對象,即創建一個新的對象并將原始對象的非靜態字段復制到新對象中。
public class Person implements Cloneable { private int age; private String name; private Listhobbies; //getters and setters @Override public Person clone() throws CloneNotSupportedException{ Person person = (Person)super.clone(); person.setHobbies(new ArrayList<>(this.getHobbies())); return person; } } Person p1 = new Person(); p1.setAge(20); p1.setName("Tom"); List hobbies = new ArrayList<>(); hobbies.add("reading"); p1.setHobbies(hobbies); Person p2 = p1.clone();//深拷貝
在代碼中,我們實現了Cloneable接口,并覆蓋了clone()方法。在方法中,我們將原始對象的引用對象也進行了深拷貝。同時,需要注意clone()方法是淺拷貝的,所以需要在方法中對原始對象的引用對象進行深拷貝。
此時,p1和p2指向的是兩個不同的對象,它們的屬性值互相不影響。
總結
淺拷貝適用于對象的屬性比較簡單,沒有引用類型的情況。深拷貝適用于對象的屬性比較復雜,存在引用類型的情況。
需要注意的是,如果對象的引用類型沒有實現Cloneable接口,那么進行深拷貝會拋出CloneNotSupportedException異常。