Java是一門面向對象的編程語言,其內存管理機制與其他語言有所不同。在Java中,對象的賦值和拷貝是常見的操作,但是賦值和拷貝的方式卻有深度拷貝和淺度拷貝之分。
淺度拷貝即是對于引用類型的對象,賦值和拷貝只是復制了引用(即指針)而已,所以它們指向的是同一個對象,當其中一個對象的值發生變化時,另一個對象也會跟著改變。這種拷貝方式表現為兩個變量指向同一個對象,只分配了一次內存空間。
如下是一個淺度拷貝的示例代碼:
class Person { public String name; } public class ShallowCopy { public static void main(String[] args) { Person person1 = new Person(); person1.name = "Tom"; Person person2 = person1; System.out.println(person1.name); System.out.println(person2.name); person2.name = "Jerry"; System.out.println(person1.name); System.out.println(person2.name); } }
這段代碼的運行結果是:
Tom Tom Jerry Jerry
在代碼中,當通過“person2 = person1”將person1賦值給person2時,person2指向了person1的內存地址。因此,修改person2的name屬性值時,person1的name屬性值也會改變。
相比之下,深度拷貝會分配兩塊內存。在對一個對象進行深度拷貝時,會將引用對象的值復制到新的對象中,而不是引用對象的指針。因此,當其中一個對象的值發生變化時,另一個對象不會改變。這種拷貝方式表現為兩個變量指向各自的對象,每個對象都分配了一次內存空間。
如下是一個深度拷貝的示例代碼:
class Person implements Cloneable { public String name; public Object clone() throws CloneNotSupportedException { return super.clone(); } } public class DeepCopy { public static void main(String[] args) throws CloneNotSupportedException { Person person1 = new Person(); person1.name = "Tom"; Person person2 = (Person) person1.clone(); System.out.println(person1.name); System.out.println(person2.name); person2.name = "Jerry"; System.out.println(person1.name); System.out.println(person2.name); } }
這段代碼的運行結果是:
Tom Tom Tom Jerry
在代碼中,當通過“(Person) person1.clone()”將person1深度拷貝給person2時,person2分配了一塊新的內存空間,兩個對象互不影響。
總之,淺度拷貝和深度拷貝分別適用于不同的情況,需要根據具體的需求來進行選擇。