两种方式实现深拷贝

原理:把对象序列化成流,再从流反序列化成对象,这样就是新的对象了。

事前准备:

@Data
public class ItWorker  {
    private String name;
    private String sex;
    private LiveAddress address;
}
@Data
public class LiveAddress  {
    private String province;
    private String city;
    private String area;
}

方式一:通过json工具序列化,把对象序列化成json字符串,然后再从字符串反序列化成对象,从而实现深拷贝。

public static void main(String[] args) {
    ItWorker itWorker = new ItWorker();
    itWorker.setName("法外狂徒张三");
    itWorker.setSex("男");

    LiveAddress liveAddress = new LiveAddress();
    liveAddress.setProvince("江苏");
    liveAddress.setCity("苏州");
    liveAddress.setArea("独墅湖");
    itWorker.setAddress(liveAddress);

    ItWorker deepItWorker = JSON.parseObject(JSON.toJSONString(itWorker), ItWorker.class);
    deepItWorker.getAddress().setCity("南京");

    System.out.println(itWorker);
    System.out.println(deepItWorker);

}

输出:

ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=苏州, area=独墅湖))
ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=南京, area=独墅湖))

方式二:使用Apache Commons Lang中提供的SerializationUtils工具实现深拷贝。

前提:实现Serializable

public class ItWorker implements Serializable 
public class LiveAddress implements Serializable
public static void main(String[] args) {
    ItWorker itWorker = new ItWorker();
    itWorker.setName("法外狂徒张三");
    itWorker.setSex("男");

    LiveAddress liveAddress = new LiveAddress();
    liveAddress.setProvince("江苏");
    liveAddress.setCity("苏州");
    liveAddress.setArea("独墅湖");
    itWorker.setAddress(liveAddress);

    ItWorker deepClone = (ItWorker) SerializationUtils.clone(itWorker);
    deepClone.getAddress().setCity("峨眉山");
    System.out.println(itWorker);
    System.out.println(deepClone);

}

输出:

ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=苏州, area=独墅湖))
ItWorker(name=法外狂徒张三, sex=男, address=LiveAddress(province=江苏, city=峨眉山, area=独墅湖))

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值