相同或相似类的对象之间的深拷贝和浅拷贝

相同或相似类的对象之间的深拷贝和浅拷贝

重写clone()

Person person = new Person("jack", new Address("chengdu"));
Person clone = person.clone();
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Cloneable {
    private String name;
    private Address address;
    @Override
    protected Person clone() throws CloneNotSupportedException {
        Person clone = (Person) super.clone();
        clone.setAddress(clone.getAddress().clone());
        return clone;
    }
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address implements Cloneable {

    private String city;

    @Override
    protected Address clone() throws CloneNotSupportedException {
        return (Address) super.clone();
    }
}

spring中BeanUtils.copyProperties()方法

Person person = new Person("jack", new Address("chengdu"));
Person clone = new Person();
BeanUtils.copyProperties(person,clone);
Student student = new Student();//和student相似的类,可复制相同名称类型相同的属性
BeanUtils.copyProperties(person,student);
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
    private String name;
    private Address address;
}

通过构造器

Person person = new Person("jack", new Address("chengdu"));
Person clone = new Person(person.getName(),new Address(person.getAddress().getCity()));
Student clone2 = new Student(person.getName(),new Address(person.getAddress().getCity()));

org.apache.commons.lang3中SerializationUtils.clone()的方法

Person person = new Person("jack", new Address("chengdu"));
Person clone = SerializationUtils.clone(person);
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Address implements Serializable {
    private String city;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Person implements Serializable {
    private String name;
    private Address address;
}

通过fastjson转换

Person person = new Person("jack", new Address("chengdu"));
String str = JSON.toJSONString(person);
Person clone = JSON.parseObject(str, Person.class);
Student clone2 = JSON.parseObject(str, Student.class);

总结

拷贝方法拷贝相同类时拷贝相似类时优点缺点
clone()父方法是浅拷贝,可通过逐层重写实现深拷贝无法拷贝扩展普通类型字段时无需修改重写方法,无需导包扩展类属性时字段,需修改该重写方法
copyProperties()浅拷贝浅拷贝扩展无需修改需要导包,底层实现使用反射,有一定的效率问题
构造器或方法可浅可深可浅可深效率快,无导包不易扩展,每次都需修改
SerializationUtils.clone()深拷贝无法拷贝扩展无需修改需导包
fastjson深拷贝深拷贝扩展无需修改需导包,效率不高


本人萌新一枚,才疏学浅,如有不足之处和错误的地方,还望各位大神指出。
欢迎大家评论讨论,一起进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值