java-深浅拷贝

目录

图形化介绍什么是深浅拷贝

Cloneable接口

如何实现深拷贝

方法1:重写clone方法

方法2: clone多嵌套 

方法3:通过序列化的方式去实现深拷贝

保证当前类以及当前类的属性都是可序列化的 

额外方法:BeanUtils.copyProperties(orig, dest)


图形化介绍什么是深浅拷贝

  •  浅拷贝:拷贝对象和引用对象指向同一个内存地址即,修改拷贝对象,原对象会受到影响

Cloneable接口

        Cloneable就是一个标记接口,本身并没有定义什么方法类似于序列化接口,clone方法是定义在object中的,

        如果类没有实现cloneale接口,直接调用object中的clone方法,会抛出异常; CloneNotSupportedException

        Object提供的clone方法是浅拷贝。

如何实现深拷贝

方法1:重写clone方法

  • 效率低

方法2: clone多嵌套 

方法3:通过序列化的方式去实现深拷贝

  • 必须保证当前类以及当前类的属性都是可序列化的 

@Override
public Main clone() throws CloneNotSupportedException {
    //序列化进行深拷贝
    Main main = null;
    //一个输出流

    try {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(baos);
        oos.writeObject(this);

        //将流序列化成对象
        ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bais);
        main = (Main)ois.readObject();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }


    return main;
}

额外方法:BeanUtils.copyProperties(orig, dest)

  • 对象拷贝的是属性值的引用,如果是基础数据类型还好,如果是一个对象类型,拷贝完成后,orig里面的对象类型属性值发生变化,dest里面相应的属性值会发生变化。会有一定的风险
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值