当前位置:首页 > Java

java如何拷贝

2026-03-20 06:22:11Java

深拷贝与浅拷贝的概念

在Java中,拷贝分为浅拷贝深拷贝

  • 浅拷贝:复制对象时,仅复制对象的引用(如成员变量为对象时,复制的是地址),原对象和拷贝对象共享内部对象。
  • 深拷贝:完全复制对象及其引用的所有对象,生成一个完全独立的副本。

实现浅拷贝的方法

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

    class Example implements Cloneable {
        int value;
        Object ref;
    
        @Override
        public Object clone() throws CloneNotSupportedException {
            return super.clone(); // 默认浅拷贝
        }
    }
  2. 通过构造方法或工厂方法
    手动复制字段值:

    class Example {
        int value;
        Object ref;
    
        Example(Example other) {
            this.value = other.value;
            this.ref = other.ref; // 浅拷贝引用
        }
    }

实现深拷贝的方法

  1. 递归调用clone()
    对引用类型字段也实现Cloneable并调用其clone()方法:

    class DeepExample implements Cloneable {
        int value;
        Object ref;
    
        @Override
        public Object clone() throws CloneNotSupportedException {
            DeepExample copy = (DeepExample) super.clone();
            copy.ref = new Object(); // 深拷贝:创建新对象
            return copy;
        }
    }
  2. 序列化与反序列化
    通过ObjectOutputStreamObjectInputStream实现完全深拷贝:

    import java.io.*;
    
    class SerializableExample implements Serializable {
        int value;
        Object ref;
    
        public SerializableExample 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 (SerializableExample) ois.readObject();
        }
    }
  3. 第三方库工具
    使用Apache Commons Lang的SerializationUtils

    java如何拷贝

    import org.apache.commons.lang3.SerializationUtils;
    
    SerializableExample original = new SerializableExample();
    SerializableExample copy = SerializationUtils.clone(original);

注意事项

  • 不可变对象(如String、基本类型包装类)无需深拷贝,因其本身不可变。
  • 性能权衡:深拷贝可能因递归或序列化导致较高开销,需根据场景选择。
  • 循环引用:深拷贝时需处理对象间的循环引用,避免栈溢出。

标签: java
分享给朋友:

相关文章

如何卸载java

如何卸载java

卸载Java的步骤 Windows系统卸载方法 打开控制面板,选择“程序和功能”或“卸载程序”。在列表中找到Java相关条目(如“Java 8 Update 251”),右键选择卸载并跟随向导完成操…

如何编写java程序

如何编写java程序

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

java如何运行程序

java如何运行程序

运行Java程序的步骤 安装Java开发工具包(JDK) 确保系统已安装JDK,可通过命令行输入java -version和javac -version验证。若未安装,需从Oracle官网下载并配置环…

java如何连接mysql数据库

java如何连接mysql数据库

连接 MySQL 数据库的步骤 添加 MySQL 驱动依赖 在项目中引入 MySQL 的 JDBC 驱动。如果使用 Maven,可以在 pom.xml 中添加以下依赖: <dependency…

如何学java基础

如何学java基础

学习Java基础的方法 理解Java的基本概念 Java是一种面向对象的编程语言,掌握基础概念如类、对象、继承、多态和封装是必要的。熟悉Java的语法结构,包括变量、数据类型、运算符和控制语句。 安…

java实现vue接口

java实现vue接口

Java 实现 Vue 接口的方法 在 Java 中实现 Vue 前端调用的接口,通常需要使用 Spring Boot 框架构建 RESTful API。以下是具体的实现步骤和代码示例。 创建 Sp…