当前位置:首页 > Java

java如何复制

2026-03-20 16:10:41Java

浅拷贝与深拷贝的基本概念

在Java中,复制对象分为浅拷贝深拷贝两种方式。

  • 浅拷贝:复制对象的基本字段值,但引用类型的字段仍指向原对象的引用。
  • 深拷贝:完全复制对象及其引用的所有对象,生成一个完全独立的副本。

实现浅拷贝的方法

1. 使用 clone() 方法
类需实现 Cloneable 接口并重写 clone() 方法:

class Person implements Cloneable {
    String name;
    int age;

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

// 使用示例
Person p1 = new Person();
Person p2 = (Person) p1.clone();

注意clone() 默认是浅拷贝,若字段为引用类型(如数组、对象),复制后的对象与原对象共享该引用。

2. 通过构造函数复制
直接在构造函数中传入原对象的字段值:

java如何复制

class Person {
    String name;
    int age;

    Person(Person other) {
        this.name = other.name;
        this.age = other.age;
    }
}

// 使用示例
Person p1 = new Person();
Person p2 = new Person(p1);

实现深拷贝的方法

1. 手动实现深拷贝
递归复制所有引用类型的字段:

class Address implements Cloneable {
    String city;

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

class Person implements Cloneable {
    String name;
    Address address;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        Person cloned = (Person) super.clone();
        cloned.address = (Address) address.clone(); // 深拷贝Address
        return cloned;
    }
}

2. 使用序列化与反序列化
通过序列化将对象转换为字节流,再反序列化生成新对象:

java如何复制

import java.io.*;

class Person implements Serializable {
    String name;
    Address address;

    Person deepCopy() throws IOException, ClassNotFoundException {
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bos);
        oos.writeObject(this);

        ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bis);
        return (Person) ois.readObject();
    }
}

要求:所有涉及的类必须实现 Serializable 接口。

第三方工具库

Apache Commons Lang
使用 SerializationUtils.clone() 实现深拷贝:

import org.apache.commons.lang3.SerializationUtils;

Person p1 = new Person();
Person p2 = SerializationUtils.clone(p1);

需添加依赖:

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

注意事项

  • 性能:深拷贝比浅拷贝开销更大,尤其是对象图复杂时。
  • 不可变对象:如 String、基本类型包装类,浅拷贝即可满足需求。
  • 循环引用:深拷贝需处理循环引用问题,避免栈溢出。

标签: java
分享给朋友:

相关文章

java如何输出

java如何输出

输出到控制台 使用 System.out.println() 方法输出内容到控制台,适用于调试或简单信息展示。 示例代码: System.out.println("Hello, World!")…

如何删除java

如何删除java

卸载 Java 的步骤 Windows 系统: 打开控制面板,选择“程序和功能”或“卸载程序”,在列表中找到 Java 相关条目(如“Java Runtime Environment”或“Java D…

如何配置java环境

如何配置java环境

下载JDK安装包 访问Oracle官网或OpenJDK官网,选择适合操作系统的JDK版本(如Windows、macOS或Linux)。下载完成后,运行安装程序并按照提示完成安装。 设置环境变量 右键…

java如何输入数组

java如何输入数组

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

如何安装java环境

如何安装java环境

下载JDK安装包 访问Oracle官方网站或OpenJDK项目页面,选择适合操作系统的JDK版本(如Windows、macOS或Linux)。确保下载与系统架构匹配的版本(32位或64位)。 运行安…

java前景如何

java前景如何

Java 当前的市场需求 Java 在企业级开发、大数据、云计算等领域仍占据重要地位。许多大型企业(如银行、电商平台)依赖 Java 构建后端系统。招聘平台数据显示,Java 开发岗位数量稳定,尤其在…