Java深克隆的几种方式

本文介绍了在Java中实现深克隆的三种方式:一是通过实现Cloneable接口并重写clone方法;二是利用序列化与反序列化;三是借助第三方库,如ApacheCommonsLang的SerializationUtils.clone,Gson以及FastJson进行对象的深克隆。每个方法都配有示例代码进行说明。
摘要由CSDN通过智能技术生成

推荐课程
1、通过继承Cloneable接口,重写clone方法实现深克隆

2、通过序列化与反序列化的方式实现深克隆

3、第三方工具类实现深克隆,克隆对象需继承Serializable接口

3.1、Apache Commons Lang的SerializationUtils.clone方法

3.2、Gson工具类

3.3、FastJson工具类

@Data
@AllArgsConstructor
@ToString
public class User implements Cloneable{
    private String name;
    private int age;
    private House house;

    @Override
    protected User clone() throws CloneNotSupportedException {
        User user = (User) super.clone();
        user.setHouse(house.clone());
        return user;
    }
}

@Data
@AllArgsConstructor
@ToString
public class House implements Cloneable{
    private String location;
    private double price;

    @Override
    protected House clone() throws CloneNotSupportedException {
        return (House) super.clone();
    }
}public static void main(String[] args) {
    House house = new House("市区", 58955);
    User user = new User("张三", 18, house);
    User cloneUser = user.clone();
}

克隆对象需继承Serializable接口

@Data
@AllArgsConstructor
@ToString
public class House implements Serializable {
    private String location;
    private double price;
}

@Data
@AllArgsConstructor
@ToString
public class User implements Serializable {
    private String name;
    private int age;
    private House house;
}

@SneakyThrows
public static void main(String[] args) {
    House house = new House("市区", 58955);
    User user = new User("张三", 18, house);

    //序列化
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
    objectOutputStream.writeObject(user);
    //反序列化
    ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
    ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
    User cloneUser = (User)objectInputStream.readObject();
}
@Data
@AllArgsConstructor
@ToString
public class House implements Serializable {
    private String location;
    private double price;
}

@Data
@AllArgsConstructor
@ToString
public class User implements Serializable {
    private String name;
    private int age;
    private House house;
}

3.1、Apache Commons Lang的SerializationUtils.clone方法


    org.apache.commons
    commons-lang3
public static void main(String[] args) {
    House house = new House("市区", 58955);
    User user = new User("张三", 18, house);
    User cloneUser = SerializationUtils.clone(user);
}

3.2、Gson工具类


    com.google.code.gson
    gson
    2.8.5
@SneakyThrows
public static void main(String[] args) {
    House house = new House("市区", 58955);
    User user = new User("张三", 18, house);    Gson gson = new Gson();
    //将对象序列化为json字符串
    String userStr = gson.toJson(user);
    //然后将字符串反序列化为对象
    User cloneUser = gson.fromJson(userStr, User.class);
}

3.3、FastJson工具类


    com.alibaba
    fastjson
    1.2.78
@SneakyThrows
public static void main(String[] args) {
    House house = new House("市区", 58955);
    User user = new User("张三", 18, house);

    //将对象序列化为json字符串
    String userStr = JSON.toJSONString(user);
    //然后将字符串反序列化为对象
    User cloneUser = JSON.parseObject(userStr, User.class);
}

以上内容为个人学习理解,如有问题,欢迎在评论区指出。
部分内容截取自网络,如有侵权,联系作者删除。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值