在Java中,我們經(jīng)常需要對(duì)對(duì)象進(jìn)行復(fù)制,并在不影響原有對(duì)象的情況下修改新對(duì)象。Java提供了兩種方式進(jìn)行對(duì)象復(fù)制,分別是淺拷貝和深拷貝。
淺拷貝是復(fù)制了對(duì)象的引用,兩個(gè)引用指向的仍是同一個(gè)對(duì)象,修改一個(gè)對(duì)象會(huì)影響另一個(gè)對(duì)象。示例代碼如下:
public class ShallowCopy implements Cloneable { private int[] arr; public ShallowCopy() { arr = new int[10]; for (int i = 0; i< arr.length; i++) { arr[i] = i; } } @Override public Object clone() throws CloneNotSupportedException { return super.clone(); } }
深拷貝則是復(fù)制了對(duì)象的內(nèi)容,兩個(gè)對(duì)象完全獨(dú)立,互不影響。示例代碼如下:
public class DeepCopy implements Cloneable { private int[] arr; public DeepCopy() { arr = new int[10]; for (int i = 0; i< arr.length; i++) { arr[i] = i; } } @Override public Object clone() throws CloneNotSupportedException { DeepCopy obj = (DeepCopy) super.clone(); obj.arr = Arrays.copyOf(this.arr, this.arr.length); return obj; } }
可以看到,在淺拷貝的實(shí)現(xiàn)中,直接調(diào)用了父類的clone()方法,而在深拷貝的實(shí)現(xiàn)中,除了調(diào)用父類的clone()方法外,還對(duì)數(shù)組進(jìn)行了復(fù)制。
總之,在對(duì)Java對(duì)象進(jìn)行復(fù)制時(shí),需要根據(jù)具體的需求選擇使用淺拷貝還是深拷貝。