当前位置:首页 > Java

java如何拷贝

2026-03-20 06:22:11Java

深拷贝与浅拷贝的概念

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

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

实现浅拷贝的方法

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

    java如何拷贝

    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()方法:

    java如何拷贝

    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

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

注意事项

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

标签: java
分享给朋友:

相关文章

如何学java

如何学java

学习Java的基础知识 Java是一门面向对象的编程语言,掌握基础语法是入门的关键。需要了解变量、数据类型、运算符、控制结构(如if-else、for循环、while循环)、数组等概念。可以通过官方文…

如何安装java软件

如何安装java软件

下载Java安装包 访问Oracle官方网站或OpenJDK开源项目页面,选择适合操作系统的Java版本(如Windows、macOS或Linux)。对于个人使用,通常下载JDK(Java Devel…

如何导入java项目

如何导入java项目

导入Java项目的方法 使用IDE导入(如IntelliJ IDEA或Eclipse) 打开IDE后选择导入现有项目,导航至项目根目录(包含pom.xml或build.gradle的文件位置)。IDE…

java如何创建测试类

java如何创建测试类

创建测试类的基本步骤 在Java中创建测试类通常使用JUnit框架,以下是具体方法: 安装JUnit依赖 对于Maven项目,在pom.xml中添加依赖: <dependency>…

如何升级java

如何升级java

检查当前Java版本 在升级之前,需确认当前安装的Java版本。在终端或命令提示符中运行以下命令: java -version 输出会显示当前Java版本(如1.8.0_301或17.0.2)。…

如何学好java编程

如何学好java编程

理解基础概念 掌握Java的基础语法是学习的起点。变量、数据类型、运算符、控制结构(如循环和条件语句)是核心内容。面向对象编程(OOP)的概念(类、对象、继承、多态、封装)是Java的核心,需深入理解…