Java深克隆的几种方式

目录

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

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

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

3.1、Apache Commons Lang的SerializationUtils.clone方法

3.2、Gson工具类

3.3、FastJson工具类


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

@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();
}

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

克隆对象需继承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();
}

3、第三方工具类实现深克隆,克隆对象需继承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;
}

3.1、Apache Commons Lang的SerializationUtils.clone方法

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
</dependency>
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工具类

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>
@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工具类

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.78</version>
</dependency>
@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);
}

以上内容为个人学习理解,如有问题,欢迎在评论区指出。

部分内容截取自网络,如有侵权,联系作者删除。

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值