开发中可以使用第三方库如Apache Commons Lang的SerializationUtils类或Google的Guava库来实现对象的深拷贝。这些库提供了更加灵活和方便的深拷贝实现方式,同时也提供了更多的自定义选项和错误处理机制。
在Java中,对象的拷贝可以分为浅拷贝(shallow copy)和深拷贝(deep copy)。
创建一个新对象,然后将原始对象中的非静态字段复制到新对象。如果字段是值类型,那么对该字段执行逐位复制。如果字段是引用类型,则递归地复制该字段引用的对象,而不是只复制引用。
在Java中,深拷贝通常需要我们自己写代码来实现,因为Java并没有提供直接实现深拷贝的内置方法。
深拷贝的一个常见实现方式是使用序列化。我们可以将对象写入到一个流中,然后再从流中读取出来,这样得到的就是原对象的一个深拷贝。但是这种方法有一些限制,比如被拷贝的对象以及它引用的所有对象都必须是可序列化的。
注意:Cloneable接口和clone()方法的设计在Java社区中常常被认为是有缺陷的,因为它们有很多问题,比如Cloneable接口没有定义任何方法(它是一个标记接口),clone()方法的访问修饰符是protected,而且它使用的是浅拷贝,这可能会导致意外的对象共享问题。因此,在实际编程中,很多开发者更倾向于自己写代码来实现对象的拷贝,而不是使用Cloneable接口和clone()方法。
我们定一个实体类People,实现了Cloneable接口,并且重写了clone()方法当然也是直接调用的父类的clone()方法。
复制
public class People implements Cloneable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
protected People clone() throws CloneNotSupportedException {
return (People) super.clone();
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
测试拷贝:
复制
public class Main {
public static void main(String[] args) {
People people = new People();
people.setName("Reathin");
people.setAge(30);
System.out.println("原People" + people.toString());
try {
People people1 = people.clone();
System.out.println("拷贝People" + people1);
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
输出结果如下,我们实现了一次浅拷贝。
复制
People people2 = new People();
people2.setName(people.getName());
people2.setAge(people.getAge());
System.out.println("深拷贝对象1" + people2);
复制
// 序列化对象到字节数组
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(people);
byte[] serializedData = byteArrayOutputStream.toByteArray();
// 从字节数组中反序列化对象以创建深拷贝
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serializedData);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
People people3 = (People) objectInputStream.readObject();
System.out.println("深拷贝对象2" + people3);
最终输出结果如下:
完整示例代码:
复制
public class People implements Cloneable, Serializable {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
protected People clone() throws CloneNotSupportedException {
return (People) super.clone();
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
复制
public class Main {
public static void main(String[] args) throws IOException, ClassNotFoundException, CloneNotSupportedException {
People people = new People();
people.setName("Reathin");
people.setAge(30);
System.out.println("原People" + people.toString());
People people1 = people.clone();
System.out.println("浅拷贝People" + people1);
//深拷贝方式一
People people2 = new People();
people2.setName(people.getName());
people2.setAge(people.getAge());
System.out.println("深拷贝对象1" + people2);
//深拷贝方式2
// 序列化对象到字节数组
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(people);
byte[] serializedData = byteArrayOutputStream.toByteArray();
// 从字节数组中反序列化对象以创建深拷贝
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serializedData);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
People people3 = (People) objectInputStream.readObject();
System.out.println("深拷贝对象2" + people3);
}
}
开发中可以使用第三方库如Apache Commons Lang的SerializationUtils类或Google的Guava库来实现对象的深拷贝。这些库提供了更加灵活和方便的深拷贝实现方式,同时也提供了更多的自定义选项和错误处理机制。
前端开发,你的认知不能仅局限于技术内,需要发散思维了解技术圈的前沿知识。细心的人会发现,开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。
介绍一款程序员都应该知道的软件JNPF快速开发平台,很多人都尝试用过它,它是功能的集大成者,任何信息化系统都可以基于它开发出来。
这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;集成了代码生成器,支持前后端业务代码生成,实现快速开发,提升工作效率;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3。如果你有闲暇时间,可以做个知识拓展。
看完本文如果觉得有用,记得点个赞支持,收藏起来说不定哪天就用上啦~