当前位置:首页 > Java

java 如何拷贝对象

2026-03-25 09:43:40Java

深拷贝与浅拷贝的区别

浅拷贝仅复制对象的引用而非对象本身,拷贝后的对象与原对象共享部分数据。深拷贝会创建一个全新的对象,包括所有嵌套对象,与原对象完全独立。

实现浅拷贝的方法

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

java 如何拷贝对象

class MyClass implements Cloneable {
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

通过拷贝构造函数实现:

class MyClass {
    private int value;
    public MyClass(MyClass other) {
        this.value = other.value;
    }
}

实现深拷贝的方法

手动实现深拷贝需要递归复制所有嵌套对象:

java 如何拷贝对象

class DeepCopyClass implements Cloneable {
    private NestedObject nested;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopyClass copy = (DeepCopyClass) super.clone();
        copy.nested = (NestedObject) nested.clone();
        return copy;
    }
}

使用序列化实现深拷贝:

import java.io.*;

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

            try (ObjectInputStream ois = new ObjectInputStream(
                 new ByteArrayInputStream(bos.toByteArray()))) {
                return (T) ois.readObject();
            }
        } catch (IOException | ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

第三方库解决方案

Apache Commons Lang提供的工具类:

MyClass copy = SerializationUtils.clone(original);

注意事项

实现Cloneable接口时应注意浅拷贝可能带来的副作用。使用序列化方式要求所有涉及的对象都必须实现Serializable接口。对于复杂对象图,建议使用专门的深拷贝工具或手动实现完全复制逻辑。

标签: 对象java
分享给朋友:

相关文章

java程序如何运行

java程序如何运行

编写Java代码 使用文本编辑器或IDE(如IntelliJ IDEA、Eclipse)编写Java源代码,保存为.java文件。例如: public class HelloWorld {…

如何运行java程序

如何运行java程序

编写Java代码 创建一个以.java为扩展名的文件,例如HelloWorld.java。文件内容需包含一个类定义,类名必须与文件名一致。例如: public class HelloWorld {…

java如何处理高并发

java如何处理高并发

Java处理高并发的方法 使用多线程和线程池 Java的java.util.concurrent包提供了线程池(如ThreadPoolExecutor)和并发工具类(如CountDownLatch、C…

jquery获取对象

jquery获取对象

jQuery 获取对象的方法 jQuery 提供了多种方法来获取 DOM 对象或元素集合,以下是常见的方法: 通过 ID 选择器 使用 #id 选择器获取具有特定 ID 的元素: $("#elem…

java如何取绝对值

java如何取绝对值

取绝对值的方法 在Java中,取绝对值可以通过以下几种方式实现: 使用Math.abs()方法 Math.abs()是Java中最常用的取绝对值方法,适用于多种数据类型: int abso…

react如何给对象添加值

react如何给对象添加值

在 React 中给对象添加值 React 中操作对象时需要注意状态更新的不可变性原则,即不能直接修改原对象,而是创建新对象。以下是几种常见方法: 使用扩展运算符(推荐) 通过扩展运算符复制原对象,…