浅拷贝和深拷贝
在具体解释Java深拷贝和浅拷贝之前,我们先看个例子,代码如下:
public class Thing implements Cloneable { // 定义一个私有变量 private ArrayList<String> arraylist = new ArrayList<String>(); @Override public Thing clone() { Thing thing = null; try { thing = (Thing)super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return thing; } public void setValue(String value) { this.arraylist.add(value); } public ArrayList<String> getValue() { return this.arraylist; } }
下面看一下浅拷贝测试:
1 public class Client { 2 public static void Main(String[] args) { 3 Thing thing = new Thing(); 4 thing.setValue("张三"); 5 6 // 拷贝一个对象 7 Thing cloneThing = thing.clone(); 8 cloneThing.setValue("李四"); 9 10 // 打印结果是[张三,李四] 11 System.out.println(thing.getValue()); 12 } 13 }
这里java做了一个偷懒的拷贝动作,Object类提供的clone()方法只是提供了拷贝本地对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生的内部元素地址,这种拷贝称为浅拷贝。
那么下面看一下如何深拷贝??
1 public class Thing implements Cloneable { 2 // 定义一个私有变量 3 private ArrayList<String> arraylist = new ArrayList<String>(); 4 5 @Override 6 public Thing clone() { 7 Thing thing = null; 8 try { 9 thing = (Thing)super.clone(); 10 11 // 深度拷贝加上这句 12 thing.arraylist = (ArrayList)this.arraylist.clone(); 13 } catch (CloneNotSupportedException e) { 14 e.printStackTrace(); 15 } 16 17 return thing; 18 } 19 20 public void setValue(String value) { 21 this.arraylist.add(value); 22 } 23 24 public ArrayList<String> getValue() { 25 return this.arraylist; 26 } 27 }
另外最后注意一下对象的clone()方法和对象内的final关键词是冲突的