两种方式实现深拷贝

发布时间:2023-12-24 15:20:05

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

事前准备:

@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=独墅湖))

文章来源:https://blog.csdn.net/gouA1270497/article/details/120702721
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。