Java对象的深拷贝和浅拷贝

1. 理解对象的深拷贝和浅拷贝

  • 浅拷贝

    浅拷贝对于基本数据类型和Stirng类型来说拷贝的是值,对于引用类型来说直接拷贝对象的引用。因此修改了原对象的引用类型会影响到拷贝对象的引用类型。

浅拷贝图解

  • 深拷贝

    深拷贝对于基本数据类型和Stirng类型来说拷贝的是值,对于引用数据类型来说会创建一个新的对象,再将引用指向该对象,因此对原来的对象进行修改不会影响到拷贝的对象。
    深拷贝图解

2. 如何实现深拷贝?

  • 1.手动实现Cloneable接口,实现clone方法逻辑(工程量大)
class Employee implements Cloneable,Serializable{
    private String name;
    private int age;
    private Address address;
    // 省略构造器,get,set,toString方法

    @Override // 逐个对象进行拷贝再赋值
    protected Employee clone() throws CloneNotSupportedException {
        Employee employee = (Employee) super.clone();
        employee.setAddress( address.clone() );
        return employee;
    }
}

class Address implements Cloneable,Serializable{
    private String country;
    private String city;
     // 省略构造器,get,set,toString方法
    
    @Override
    protected Address clone() throws CloneNotSupportedException {
        return (Address)super.clone();
    }
}
  • 2.使用序列化和反序列化实现深拷贝(必须实现Serializable接口)
    序列化产生的是两个完全独立的对象,无论嵌套多少个引用类型序列化都能实现深拷贝
public Employee deepCopy() throws IOException, ClassNotFoundException {
    // 序列化
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(this);
    // 反序列化
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    ObjectInputStream ois =new ObjectInputStream(bis);
    return (Employee) ois.readObject();
}

3. 总结对象的深拷贝和浅拷贝的区别

深拷贝浅拷贝
基本数据类型和String拷贝的是值,修改属性不会相互影响基本数据类型和String拷贝的是值,修改属性不会相互影响
对象中引用数据类型属性拷贝的是一个全新的对象,原对象中修改引用对象属性对拷贝对象无影响对象中引用数据类型属性拷贝的是引用,原对象中修改了引用对象会影响到拷贝对象
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值