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

Java中实现对象的深拷贝(Deep Copy)

在Java中实现对象的深拷贝(Deep Copy)意味着创建一个对象的副本,使得原对象和副本对象完全分离,对副本对象的任何修改都不会影响到原对象。以下是几种实现深拷贝的方法:

1. 手动实现深拷贝

对于自定义类,可以通过复制每个字段来实现深拷贝:

public class Person {private String name;private List<String> hobbies;private Address address;// 构造函数、getter和setter省略// 深拷贝方法public Person deepCopy() {Person copy = new Person();copy.name = new String(this.name); // 对于String类型,复制引用即可copy.hobbies = new ArrayList<>(this.hobbies); // 对于集合类型,创建新实例并复制元素copy.address = new Address(this.address.city, this.address.street); // 对于自定义对象类型,复制每个字段return copy;}
}public class Address {private String city;private String street;public Address(String city, String street) {this.city = city;this.street = street;}
}

2. 使用序列化

如果对象实现了Serializable接口,可以通过序列化和反序列化来实现深拷贝:

import java.io.*;public class DeepCopyUtil {public static <T extends Serializable> T deepCopy(T object) {try {ByteArrayOutputStream bao = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bao);oos.writeObject(object);ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (T) ois.readObject();} catch (IOException | ClassNotFoundException e) {throw new RuntimeException(e);}}
}

使用这种方法时,对象及其所有成员变量都必须实现Serializable接口。

3. 使用第三方库

有些第三方库如Apache Commons Lang提供了深拷贝的实现,例如SerializationUtils.clone()方法。

import org.apache.commons.lang3.SerializationUtils;public class DeepCopyExample {public static void main(String[] args) {Person original = new Person("John", Arrays.asList("Reading", "Hiking"), new Address("New York", "Park Ave"));Person copy = SerializationUtils.clone(original);// 修改copy不会影响original}
}

4. 使用克隆方法(Cloneable接口)

如果对象类实现了Cloneable接口,并覆盖了Object类的clone()方法,可以使用克隆来实现深拷贝:

public class Person implements Cloneable {private String name;private List<String> hobbies;private Address address;// 构造函数、getter和setter省略@Overrideprotected Object clone() throws CloneNotSupportedException {Person copy = (Person) super.clone();copy.hobbies = new ArrayList<>(this.hobbies); // 对于可变对象,创建新实例copy.address = new Address(this.address.city, this.address.street); // 复制不可变对象return copy;}
}

请注意,使用Cloneable接口实现深拷贝时,需要确保所有成员变量也是可克隆的,或者为它们各自提供深拷贝的逻辑。

选择哪种方法取决于你的具体需求,例如对象的复杂性、是否实现了Serializable接口、性能要求等。在某些情况下,手动实现深拷贝可能是最直接和可控的方法。

相关文章:

Java中实现对象的深拷贝(Deep Copy)

在Java中实现对象的深拷贝&#xff08;Deep Copy&#xff09;意味着创建一个对象的副本&#xff0c;使得原对象和副本对象完全分离&#xff0c;对副本对象的任何修改都不会影响到原对象。以下是几种实现深拷贝的方法&#xff1a; 1. 手动实现深拷贝 对于自定义类&#xff0c;…...

位置编码-APE

Transformer 中的绝对位置编码 &#xff08;以下由gpt 生成&#xff09; Transformer 的绝对位置编码&#xff08;Absolute Position Encoding, APE&#xff09;是用于对序列数据中的位置信息进行建模的一种方法。在 Transformer 的架构中&#xff0c;输入数据&#xff08;如句…...

MySQL有哪些锁?

1.MySQL有哪些锁&#xff1f; 全局锁表级锁 表锁元数据锁意向锁 行级锁 记录锁间隙锁临键锁临时意向锁 我了解的是MySQL的锁可以分为全局锁、表级锁、行级锁。 我比较熟悉的是表级锁和行级锁&#xff0c;如果我们对表结构进行修改时&#xff0c;MySQL就会对这个表结构加一个…...

Everything实现,快速搜索文件

最近编写NTFS文件实时搜索工具, 类似 Everything 这样, 翻阅了很多博客, 结果大致如下: 1.分析比较肤浅, 采用USN日志枚举来获取文件记录 速度一言难尽, 因为日志枚举的是全盘所有文件的所有日志, 记录比文件记录还多, 速度当然很慢, 还有的甚至于是 使用 DeviceIoControl 函数…...

[硬件] DELL BIOS 相关注意事项

前言 前段时间重装系统. DELL BIOS属实资料少, 又难用. 这里给出相关的注意事项, 并且配上图片. BIOS相关注意事项 进入BIOS ESC/F2/ F12. 都可以进入BIOS, 当进U盘的入Win PE系统时, 使用F12 效果更佳. 关闭安全模式 切换到Boot Configuration选项,将Secure Boot选项off选…...

Rocky Linux 下安装Liboffice

Rocky Linux下安装Liboffice。 Step1: 在桌面&#xff0c;单击击键盘的Window键&#xff0c;点击出现的白色software按钮图标&#xff1b; Step2: 输入lib&#xff0c;即可自动跳出libre Office, 进行安装&#xff1b; Step3: Have fun with Rocky Linux....

【每日学点鸿蒙知识】长时任务、HarmonyAppProvision申请、preferences、Testing工具、应用保活

1、HarmonyOS 如何解决语音聊天、通信app退后台系统采集播放回调就会停止&#xff0c;回前台未恢复&#xff1f; 关于应用切到后台系统采集播放回调停止的问题原因如下&#xff1a;为了降低设备耗电速度、保障用户使用流畅度&#xff0c;系统会对退至后台的应用进行管控&#…...

步进电机驱动算法——S形加减速算法原理

1. 前言&#xff1a; 最近项目又用到了步进电机&#xff0c;为了在运动中加减速更加平稳决定研究一下S型加减速&#xff0c;原来用过野火的s型加减速程序&#xff0c;云里雾里的移植成功了&#xff0c;今天再翻来程序看一脸懵逼&#xff0c;重新学习了一下发现所有公式都能看懂…...

【图像去噪】论文复现:大道至简!ZS-N2N的Pytorch源码复现,跑通源码,获得指标计算结果,补充保存去噪结果图像代码,代码实现与论文理论对应!

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 完整代码和训练好的模型权重文件下载链接见本文底…...

2024年中国新能源汽车用车发展怎么样 PaperGPT(一)

概述 在国家政策的强力扶持下&#xff0c;2024年中国新能源汽车市场迎来了新的发展机遇。本文将基于《中国新能源汽车用车报告&#xff08;2024年&#xff09;》的数据&#xff0c;对新能源汽车的市场发展和用车趋势概述。 新能源汽车市场发展 政策推动&#xff1a;国家和地…...

数据结构-排序思想

直接插入排序 将后面的无序区中的元素挨个向前面的有序区中插入。 1.将顺序表中R[0]用作哨兵&#xff0c;按索引i2...n的次序&#xff0c;将R[i]向有序区R[1...i-1]中执行插入操作。 2.插入操作可采取在有序区中从后向前的查找比较和移动的方法。 3.此操作中比较的次数与原序列…...

python 快速排序(Quick Sort)

快速排序&#xff08;Quick Sort&#xff09; 快速排序是一种高效的排序算法&#xff0c;采用分治法&#xff08;Divide and Conquer&#xff09;策略。它的基本思想是&#xff1a;选择一个基准元素&#xff08;pivot&#xff09;&#xff0c;将数组分为两部分&#xff0c;使得…...

MySQL数据库——常见慢查询优化方式

本文详细介绍MySQL的慢查询相关概念&#xff0c;分析步骤及其优化方案等。 文章目录 什么是慢查询日志&#xff1f;慢查询日志的相关参数如何启用慢查询日志&#xff1f;方式一&#xff1a;修改配置文件方式二&#xff1a;通过命令动态启用 分析慢查询日志方式一&#xff1a;直…...

【AIGC篇】AIGC 引擎:点燃创作自动化的未来之火

&#xff1a;羑悻的小杀马特.-CSDN博客 未来都是惊喜。你生来本应为高山。并非草芥。 引言&#xff1a; 在当今数字化的时代&#xff0c;人工智能生成内容&#xff08;AIGC&#xff09;正以一种前所未有的力量改变着我们的创作领域。它就像一个神秘而强大的魔法师&#xff0c;…...

C语言性能优化:从基础到高级的全面指南

引言 C 语言以其高效、灵活和功能强大而著称&#xff0c;被广泛应用于系统编程、嵌入式开发、游戏开发等领域。然而&#xff0c;要写出高性能的 C 语言代码&#xff0c;需要对 C 语言的特性和底层硬件有深入的了解。本文将详细介绍 C 语言性能优化的背后技术&#xff0c;并通过…...

常用的公共 NTP(网络时间协议)服务器

公共 NTP 服务列表 以下是一些常用的公共 NTP&#xff08;网络时间协议&#xff09;服务器&#xff0c;供您参考&#xff1a; 中国地区公共 NTP 服务器 国家授时中心 NTP 服务器&#xff1a;ntp.ntsc.ac.cn中国 NTP 快速授时服务&#xff1a;cn.ntp.org.cn阿里云公共 NTP 服务…...

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…...

Unity 使用UGUI制作卷轴开启关闭效果

视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …...

MarkDown怎么转pdf;Mark Text怎么使用;

MarkDown怎么转pdf 目录 MarkDown怎么转pdf先用CSDN进行编辑,能双向看版式;标题最后直接导出pdfMark Text怎么使用一、界面介绍二、基本操作三、视图模式四、其他功能先用CSDN进行编辑,能双向看版式; 标题最后直接导出pdf Mark Text怎么使用 Mark Text是一款简洁的开源Mar…...

整合版canal ha搭建--基于1.1.4版本

开启MySql Binlog&#xff08;1&#xff09;修改MySql配置文件&#xff08;2&#xff09;重启MySql服务,查看配置是否生效&#xff08;3&#xff09;配置起效果后&#xff0c;创建canal用户&#xff0c;并赋予权限安装canal-admin&#xff08;1&#xff09;解压 canal.admin-1…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...