概念?
淺拷貝(Shallow Copy)和深拷貝(Deep Copy)是在對象復制過程中常用的概念。
- 淺拷貝是指創建一個新對象,并將原始對象的非靜態字段的值拷貝到新對象中。如果字段是基本數據類型,直接復制其值;如果字段是引用類型,復制的是引用而不是對象本身。因此,在淺拷貝中,新舊對象共享引用類型字段所指向的對象。
- 深拷貝是指創建一個新對象,并將原始對象的所有字段的值拷貝到新對象中,包括引用類型字段所指向的對象。通過深拷貝,可以實現兩個獨立的對象,彼此之間沒有任何關聯。修改其中一個對象的字段值不會影響另一個對象的字段值。
選擇使用淺拷貝還是深拷貝取決于實際需求。如果希望復制對象后的修改不會影響原始對象,應該使用深拷貝;如果可以接受復制對象的修改影響原始對象,或者對象較大且復制性能要求高,則可以使用淺拷貝。
綜上所述:
-
淺拷貝:
- 對于簡單對象(如基本數據類型),直接復制其值。
- 對于引用類型字段,復制其引用而不是對象本身。
結果是,原始對象和復制對象之間共享相同的引用,對原始對象的修改會影響到復制對象,但是對于引用類型字段指向的對象本身的修改則不會影響。
-
深拷貝:
- 對于簡單對象和引用類型字段,分別遞歸地創建它們的獨立副本,保證復制對象與原始對象完全獨立。
結果是,原始對象和復制對象之間沒有任何引用關系,彼此獨立存在,修改其中一個對象不會影響另一個對象。
可以這么理解,從A這里復制出來了一個B,此時我修改了A的對象,而B的對象也跟著改變,這則是淺拷貝。相反,我修改了A的對象,而B的對象不跟著改變,這便是深拷貝。
示例代碼:
//創建一個類Person
class Person {String name;int age;// 構造函數public Person(String name, int age) {this.name = name;this.age = age;}// 重寫toString方法@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}
}public class myclass {public static void main(String[] args) {// 創建一個Person對象Person person1 = new Person("John", 25);// 淺拷貝示例Person person2 = person1; // 直接將person1的引用賦值給person2person2.age = 30; // 修改person2的屬性,也會影響到person1System.out.println("淺拷貝示例:");System.out.println("person1: " + person1);//運行結果:person1: Person [name=John, age=30]System.out.println("person2: " + person2);//運行結果:person2: Person [name=John, age=30]// 深拷貝示例Person person3 = new Person(person1.name, person1.age); // 創建新的Person對象,將person1的屬性值復制給person3person3.age = 35; // 修改person3的屬性,不會影響到person1System.out.println("深拷貝示例:");System.out.println("person1: " + person1);//運行結果:person1: Person [name=John, age=30]System.out.println("person3: " + person3);//運行結果:person3: Person [name=John, age=35]}
}