当前位置:首页 > 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

安装Java开发环境 下载并安装Java Development Kit(JDK),推荐从Oracle官网或OpenJDK获取最新版本。安装完成后配置环境变量,确保JAVA_HOME指向JDK安装路径…

java如何学习

java如何学习

学习Java的有效方法 理解基础概念 Java是一门面向对象的编程语言,掌握基础概念如变量、数据类型、运算符、控制语句(if-else、循环)是必要的。面向对象的核心概念包括类、对象、继承、多态和封装…

java如何调用接口

java如何调用接口

调用接口的基本方法 在Java中调用接口通常涉及实现接口或使用接口引用对象。以下是几种常见场景的示例: 定义接口 public interface MyInterface { void d…

java如何创建类

java如何创建类

创建类的基本语法 在Java中,类通过class关键字定义,语法如下: [访问修饰符] class 类名 { // 成员变量(属性) // 构造方法 // 成员方法 }…

java如何输入数据

java如何输入数据

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

java如何输入字符串

java如何输入字符串

使用 Scanner 类 在 Java 中,可以通过 java.util.Scanner 类来输入字符串。以下是一个示例代码: import java.util.Scanner; public c…