在學(xué)習(xí)Java編程語言中,我們會對深復(fù)制和淺復(fù)制有所了解。那么,深復(fù)制和淺復(fù)制有什么區(qū)別呢?
淺復(fù)制是指將一個對象的引用直接賦給另一個對象,新對象和原對象共享同一個實(shí)例變量,當(dāng)原對象中的實(shí)例變量發(fā)生改變時,新對象中的實(shí)例變量也會跟著改變。而深復(fù)制則是將原對象中的實(shí)例變量復(fù)制一份到新對象中,新對象和原對象各自擁有一份實(shí)例變量,互不干擾。
//淺復(fù)制 public class ShallowCopy implements Cloneable { private int[] value; public ShallowCopy() { value = new int[]{1, 2, 3, 4, 5}; } public void setValue(int index, int val) { value[index] = val; } public int getValue(int index) { return value[index]; } public Object clone() throws CloneNotSupportedException { return super.clone(); } } ShallowCopy original = new ShallowCopy(); ShallowCopy copy = (ShallowCopy) original.clone(); System.out.println(original.getValue(2)); //輸出3 copy.setValue(2, 9); System.out.println(original.getValue(2)); //輸出9
//深復(fù)制 public class DeepCopy implements Cloneable { private int[] value; public DeepCopy() { value = new int[]{1, 2, 3, 4, 5}; } public void setValue(int index, int val) { value[index] = val; } public int getValue(int index) { return value[index]; } public Object clone() throws CloneNotSupportedException { DeepCopy copy = (DeepCopy) super.clone(); copy.value = new int[value.length]; System.arraycopy(value, 0, copy.value, 0, value.length); return copy; } } DeepCopy original = new DeepCopy(); DeepCopy copy = (DeepCopy) original.clone(); System.out.println(original.getValue(2)); //輸出3 copy.setValue(2, 9); System.out.println(original.getValue(2)); //輸出3
通過上面的例子可以看出,淺復(fù)制只是復(fù)制了引用,對原對象的修改會影響到新對象,而深復(fù)制則是完全獨(dú)立的拷貝,不會對原對象造成影響。