当前位置: 首页 > news >正文

深克隆java对象的方式

Java 对象深克隆(Deep Clone)的几种实现方式

深克隆是指创建一个新对象,并递归复制原对象及其引用的所有对象,使得新对象与原对象完全独立,修改其中一个不会影响另一个。以下是Java中实现深克隆的几种主要方式:

1. 序列化/反序列化方式

这是最通用的深克隆方法,适用于任何实现了Serializable接口的对象。

import java.io.*;public class DeepCloneUtil {@SuppressWarnings("unchecked")public static <T extends Serializable> T clone(T obj) {try (ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos)) {oos.writeObject(obj);try (ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais)) {return (T) ois.readObject();}} catch (IOException | ClassNotFoundException e) {throw new RuntimeException("Deep clone failed", e);}}
}// 使用示例
Person original = new Person("张三", 25);
Person cloned = DeepCloneUtil.clone(original);

优点

  • 通用性强,适用于任何可序列化对象
  • 实现简单

缺点

  • 性能较低(涉及I/O操作)
  • 要求所有引用的对象都必须实现Serializable接口
  • 无法克隆transient字段

2. 手动实现Cloneable接口

通过重写clone()方法实现深克隆。

class Address implements Cloneable {private String city;private String street;// 构造方法、getter/setter省略@Overrideprotected Address clone() {try {return (Address) super.clone();} catch (CloneNotSupportedException e) {throw new AssertionError(); // 不会发生}}
}class Person implements Cloneable {private String name;private int age;private Address address;// 构造方法、getter/setter省略@Overrideprotected Person clone() {try {Person cloned = (Person) super.clone();cloned.address = this.address.clone(); // 深克隆引用对象return cloned;} catch (CloneNotSupportedException e) {throw new AssertionError();}}
}// 使用示例
Person original = new Person("张三", 25, new Address("北京", "长安街"));
Person cloned = original.clone();

优点

  • 性能较好
  • 可以精确控制克隆过程

缺点

  • 需要为每个类手动实现克隆逻辑
  • 当对象图复杂时,实现繁琐
  • 需要所有引用对象都实现Cloneable

3. 使用第三方库

(1) Apache Commons Lang - SerializationUtils

import org.apache.commons.lang3.SerializationUtils;Person original = new Person("张三", 25);
Person cloned = SerializationUtils.clone(original);

(2) JSON序列化方式(如Gson/Jackson)

import com.google.gson.Gson;Gson gson = new Gson();
Person original = new Person("张三", 25);
Person cloned = gson.fromJson(gson.toJson(original), Person.class);

优点

  • 实现简单
  • 不要求对象实现SerializableCloneable

缺点

  • JSON序列化会丢失对象类型信息(如多态)
  • 性能比原生序列化更低
  • 无法处理循环引用

4. 使用Java深层复制工具库

Cloner库(https://github.com/kostaskougios/cloning):

import com.rits.cloning.Cloner;Cloner cloner = new Cloner();
Person original = new Person("张三", 25);
Person cloned = cloner.deepClone(original);

优点

  • 功能强大,可以处理复杂对象图
  • 性能较好
  • 不需要实现特定接口

缺点

  • 需要引入第三方依赖
http://www.lqws.cn/news/173521.html

相关文章:

  • 基于 Vue 和 Spring Boot 实现滑块验证码的机器验证
  • 【Linux】awk 命令详解及使用示例:结构化文本数据处理工具
  • python训练营打卡第46天
  • 打造你的 Android 图像编辑器:深入解析 PhotoEditor 开源库
  • windows server 添加自动启动服务
  • 使用阿里云百炼embeddings+langchain+Milvus实现简单RAG
  • PostgreSQL17 编译安装+相关问题解决
  • KAG与RAG在医疗人工智能系统中的多维对比分析
  • 完美搭建appium自动化环境
  • PyQt常用控件的使用:QFileDialog、QMessageBox、QTreeWidget、QRadioButton等
  • html表格转换为markdown
  • 【cmake】单配置生成器与多配置生成器的构建安装问题分析
  • Ubuntu Cursor升级成v1.0
  • C文件操作2
  • 什么是敏捷项目管理?敏捷项目管理有哪些功能?
  • 《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
  • 抽象工厂模式深度解析:从原理到与应用实战
  • android 之 MediaExtractor
  • JuiceFS v1.3-Beta2:集成 Apache Ranger,实现更精细化的权限控制
  • 使用 Windows 完成 iOS 应用上架:Appuploader对比其他证书与上传方案
  • uniapp map组件的基础与实践
  • Flink checkpoint
  • LlamaIndex 工作流简介以及基础工作流
  • 中国首套1公里高分辨率大气湿度指数数据集(2003~2020)
  • C++11完美转发
  • 练习:对象数组 4
  • Electron Fiddle使用笔记
  • 面向无人机海岸带生态系统监测的语义分割基准数据集
  • stylus - 新生代CSS预处理框架
  • 我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店