浅拷贝深拷贝

深拷贝浅拷贝区别
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。
但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象

// 深拷贝实现方式
构造方法:修改对象后需要修改构造方法,可用性差
重载clone():修改对象后需要修改clone方法,拷贝类需要实现Cloneable接口,可用性差

1.序列化:拷贝类需要实现Serializable接口
@Data
public class Person implements Serializable {
    public String name;
    public Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }
  
}

@Data
class Address implements Serializable{
    private String nation;
    private String city;

    public Address(String nation, String city) {
        this.nation = nation;
        this.city = city;
    }

}

public static void main(String[] args) throws Exception {
    Person person1 = new Person("小明", new Address("中国", "重庆"));

    // 序列化
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(bos);
    oos.writeObject(person1);

    // 反序列化
    ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
    ObjectInputStream ois = new ObjectInputStream(bis);
    Person person2 = (Person) ois.readObject();

	// 使用序列化工具org.springframework.util.SerializationUtils
	byte[] serialize = SerializationUtils.serialize(person1);
	Person person2 = (Person) SerializationUtils.deserialize(serialize);

    System.out.println(person2.getAddress().getCity());
    person1.getAddress().setCity("上海");
    System.out.println(person2.getAddress().getCity());
}
2.json
@Data
public class Person {
    private String name;
    private Address address;

    public Person(String name, Address address) {
        this.name = name;
        this.address = address;
    }
}

@Data
public class Address {
    private String nation;
    private String city;

    public Address(String nation, String city) {
        this.nation = nation;
        this.city = city;
    }
}

public static void main(String[] args) throws Exception {
    Person person1 = new Person("小明", new Address("中国", "重庆"));

    String str = JSON.toJSONString(person1);
    Person person2 = JSONObject.parseObject(str, Person.class);

    System.out.println(person2.getAddress().getCity());
    person1.getAddress().setCity("上海");
    System.out.println(person2.getAddress().getCity());
}
// 3.手写递归方法
递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值