Cloneable接口与浅克隆,深克隆

文章目录

浅克隆,深克隆又称为浅拷贝、深拷贝。

浅拷贝:对基本数据类型进行值传递,对引用数据类型进行引用传递般的拷贝,此为浅拷贝。
深拷贝:对基本数据类型进行值传递,对引用数据类型创建一个新的对象,并复制其内容,此为深拷贝。
在这里插入图片描述
由图可以看出,浅拷贝是有风险的浅拷贝时,对于引用数据类型的数据,拷贝对象的此属性也指向了原对象的引用地址,说明拷贝对象没有新建此引用对象,而是直接将原对象的引用对象地址给了拷贝对象,这样带来的问题是,两个对象对此属性的操作,会相互影响

例如: 浅拷贝

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值