Java中的拷貝分為兩種:淺拷貝和深拷貝。這兩種拷貝方法的使用場景不同,能夠滿足程序員不同的需求。下面我們來具體了解一下淺拷貝和深拷貝的應(yīng)用范圍。
淺拷貝的使用場景
下面是一個(gè)使用淺拷貝的示例: class MyClass implements Cloneable{ public int[] arr = {1, 2, 3, 4}; @Override protected Object clone() throws CloneNotSupportedException { return super.clone(); } } public class ShallowCopyDemo { public static void main(String[] args) throws CloneNotSupportedException { MyClass obj1 = new MyClass(); MyClass obj2 = (MyClass) obj1.clone(); System.out.println(obj1 == obj2); //false System.out.println(obj1.arr == obj2.arr); //true } }
上面的示例中,我們使用淺拷貝方法clone()拷貝了一個(gè)MyClass的對象。在淺拷貝中,我們會發(fā)現(xiàn)兩個(gè)對象的引用指向了同一個(gè)數(shù)組。也就是說,當(dāng)我們修改obj1的數(shù)組時(shí),obj2也會隨之改變。因此,當(dāng)我們需要拷貝一個(gè)對象,但是不需要改變其中引用類型數(shù)據(jù)的值時(shí),可以使用淺拷貝。
深拷貝的使用場景
下面是一個(gè)使用深拷貝的示例: class MyClass implements Cloneable{ public int[] arr = {1, 2, 3, 4}; @Override protected Object clone() throws CloneNotSupportedException { MyClass obj = (MyClass) super.clone(); obj.arr = Arrays.copyOf(arr, arr.length); return obj; } } public class DeepCopyDemo { public static void main(String[] args) throws CloneNotSupportedException { MyClass obj1 = new MyClass(); MyClass obj2 = (MyClass) obj1.clone(); System.out.println(obj1 == obj2); //false System.out.println(obj1.arr == obj2.arr); //false } }
在上面的示例中,我們使用深拷貝方法clone()拷貝了一個(gè)MyClass的對象。在深拷貝中,我們可以發(fā)現(xiàn),兩個(gè)對象中的數(shù)組引用指向了兩個(gè)不同的數(shù)組。也就是說,當(dāng)我們修改obj1的數(shù)組時(shí),obj2并不會隨之改變。因此,當(dāng)我們需要拷貝一個(gè)對象,并且需要改變其中引用類型數(shù)據(jù)的值時(shí),可以使用深拷貝。