相同或相似类的对象之间的深拷贝和浅拷贝
重写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 | 深拷贝 | 深拷贝 | 扩展无需修改 | 需导包,效率不高 |
本人萌新一枚,才疏学浅,如有不足之处和错误的地方,还望各位大神指出。
欢迎大家评论讨论,一起进步。