当前位置:首页 > Java

java 如何深拷贝

2026-03-25 14:06:35Java

深拷贝的实现方法

在Java中实现深拷贝可以通过以下几种方式,确保对象及其引用的所有对象都被复制,而不仅仅是引用。

实现Cloneable接口并重写clone方法

通过实现Cloneable接口并重写clone方法,可以手动实现深拷贝。需要在clone方法中递归调用引用对象的clone方法。

class Person implements Cloneable {
    private String name;
    private Address address;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person cloned = (Person) super.clone();
        cloned.address = (Address) address.clone(); // 递归调用address的clone
        return cloned;
    }
}

class Address implements Cloneable {
    private String city;

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

使用序列化和反序列化

通过将对象序列化为字节流,再反序列化为新对象,可以实现深拷贝。这种方式要求所有相关类实现Serializable接口。

import java.io.*;

public class DeepCopyUtil {
    public static <T extends Serializable> T deepCopy(T object) {
        try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
             ObjectOutputStream oos = new ObjectOutputStream(bos)) {
            oos.writeObject(object);
            oos.flush();

            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return (T) ois.readObject();
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException("Deep copy failed", e);
        }
    }
}

使用第三方库

一些第三方库(如Apache Commons Lang或Gson)提供了深拷贝的工具方法。

Apache Commons Lang:

Person copiedPerson = SerializationUtils.clone(originalPerson);

Gson:

Gson gson = new Gson();
Person copiedPerson = gson.fromJson(gson.toJson(originalPerson), Person.class);

手动复制

对于简单对象,可以手动创建新对象并复制所有字段,包括引用对象的字段。

java 如何深拷贝

Person copiedPerson = new Person();
copiedPerson.setName(originalPerson.getName());
copiedPerson.setAddress(new Address(originalPerson.getAddress().getCity()));

注意事项

  • 使用Cloneable接口时,需要确保所有嵌套对象都支持深拷贝。
  • 序列化方式性能较低,但适用于复杂对象图。
  • 第三方库通常更简洁,但需引入额外依赖。
  • 手动复制适用于简单场景,但维护成本较高。

标签: java
分享给朋友:

相关文章

java如何运行

java如何运行

运行Java程序的基本方法 Java程序的运行需要经过编写、编译和执行三个主要阶段。以下是具体步骤: 编写Java源代码 创建一个以.java为后缀的文件,例如HelloWorld.java。文件内…

java如何输出数组

java如何输出数组

输出数组的方法 在Java中,输出数组内容有多种方式,具体取决于数组类型和输出格式需求。以下是几种常见的方法: 使用Arrays.toString()方法 适用于一维数组,直接调用Arrays.to…

java如何输入数组

java如何输入数组

输入数组的方法 在Java中,可以通过多种方式输入数组,具体取决于输入源(如控制台、文件等)和数组类型(如基本类型或对象类型)。以下是几种常见的方法: 使用Scanner从控制台输入 对于基本数据类…

java如何创建对象

java如何创建对象

创建对象的基本方法 在Java中,创建对象主要通过new关键字调用构造函数完成。基本语法为: ClassName objectName = new ClassName(); 例如创建String对象…

java如何上传文件

java如何上传文件

使用HttpURLConnection上传文件 在Java中,可以通过HttpURLConnection实现文件上传功能。需要设置请求头为multipart/form-data,并构建包含文件数据的请…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常用…