1. 首页
  2. Java

Java中对象深拷贝方法

1.序列化与反序列化

import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.IORuntimeException;
import java.io.*;
 
public class DeepCopyExample {
    public static <T> T deepCopy(T object) {
        try {
            // 创建一个字节输出流
            ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
            // 创建一个对象输出流包装字节输出流
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            // 将对象写入到输出流中
            out.writeObject(object);
            // 关闭对象输出流,释放资源
            out.close();
            // 创建一个字节输入流包装字节输出流中的数据
            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            // 创建一个对象输入流包装字节输入流
            ObjectInputStream in = new ObjectInputStream(byteIn);
            // 从输入流中读取对象并返回
            @SuppressWarnings("unchecked")
            T copyObject = (T) in.readObject();
            // 关闭对象输入流,释放资源
            in.close();
            return copyObject;
        } catch (IOException | ClassNotFoundException e) {
            throw new IORuntimeException(e);
        }
    }
    
    public static void main(String[] args) {
        MyObject original = new MyObject(1, "Test");
        MyObject copy = deepCopy(original);
        System.out.println("Original: " + original); // Original: MyObject{id=1, name='Test'}
        System.out.println("Copy: " + copy); // Copy: MyObject{id=1, name='Test'} (注意:这里的输出可能看起来相同,但实际上是不同的对象)
    }
}

2.Hutool 工具类

Hutool 提供了简单易用的工具类,可以进行深拷贝和浅拷贝:

深拷贝

Person deepCopy = CloneUtil.clone(original);

这里也补充一下Hutool的浅拷贝

Person copy = ShallowUtil.clone(original); 

3.Apache SerializationUtils

apache SerializationUtils使用的也是Java原生的序列化和反序列化,来实现对象的深拷贝,因此类也需要实现Serializable接口。

pom文件中引入如下依赖:

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

使用如下:

User newUser = SerializationUtils.clone(oldUser);

TOP