java的深拷貝和淺拷貝
阿新 • • 發佈:2018-12-14
淺拷貝:
public class PrototypeClass implements Cloneable { private List<String> params = new ArrayList<String>(); @Override protected PrototypeClass clone() { PrototypeClass prototypeClass = null; try { prototypeClass = (PrototypeClass) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return prototypeClass; } public void setValue(String param) { this.params.add(param); } public List getValue(){ return this.params; } }
測試一下:
public class PrototypeClassTest { @Test public void test(){ PrototypeClass prototypeClass = new PrototypeClass(); prototypeClass.setValue("12"); PrototypeClass clone = prototypeClass.clone(); clone.setValue("13"); System.out.println(prototypeClass.getValue()); } }
執行一下你會發現結果並不是你想象的["12"],而是["12","13"],這種情況是因為Java做了一個偷懶的拷貝動作,object物件提供的clone()方法只是拷貝了物件,其物件內部的陣列、引用物件(String是一個特殊的引用物件,它是沒有clone方法的,是能夠被拷貝的,)都不會被拷貝,還是指向原生物件的內部元素地址,這種拷貝叫做淺拷貝。
深拷貝:
public class PrototypeClass implements Cloneable { private ArrayList<String> params = new ArrayList<String>(); @Override protected PrototypeClass clone() { PrototypeClass prototypeClass = null; try { prototypeClass = (PrototypeClass) super.clone(); this.params = (ArrayList<String>) params.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return prototypeClass; } public void setValue(String param) { this.params.add(param); } public List getValue(){ return this.params; } }
只需要將類中的成員變數單獨拷貝,這樣便是深拷貝。