文章目录
浅克隆,深克隆又称为浅拷贝、深拷贝。
浅拷贝
:对基本数据类型
进行值传递
,对引用数据类型
进行引用传递
般的拷贝,此为浅拷贝。
深拷贝
:对基本数据类型
进行值传递
,对引用数据类型
,创建一个新的对象,并复制其内容
,此为深拷贝。
由图可以看出,浅拷贝是有风险的
,浅拷贝时
,对于引用数据类型
的数据,拷贝对象的此属性也指向了原对象的引用地址
,说明拷贝对象没有新建此引用对象,而是直接将原对象的引用对象地址给了拷贝对象,这样带来的问题是,两个对象对此属性的操作,会相互影响
。
例如: 浅拷贝
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;
}
//设置HashMap的值
public void setValue(String value){
this.arrayList.add(value);
}
//取得arrayList的值
public ArrayList<String> getValue(){
return this.arrayList;
}
}
在Thing类中增加一个私有变量arrayLis,类型为ArrayList,然后通过setValue和getValue分别进行设置和取值,我们来看场景类是如何拷贝的,如代码所示。
浅拷贝测试
public class Client {
public static void main(String[] args) {
//产生一个对象
Thing thing = new Thing();
//设置一个值
thing.setValue("张三");
//拷贝一个对象
Thing cloneThing = thing.clone();
cloneThing.setValue("李四");
System.out.println(thing.getValue());
}
}
猜想一下运行结果应该是什么?是仅一个“张三”吗?运行结果如下所示:
[张三,李四]
怎么会有李四呢?是因为Java做了一个偷懒的拷贝动作,Object类提供的方法clone只是拷贝本对象,其对象内部的数组、引用对象等都不拷贝,还是指向原生对象的内部元素地址,这种拷贝就叫做浅拷贝。
深克隆可以使用工具类:https://blog.csdn.net/qq_40419080/article/details/120952834