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

Java 深拷贝和浅拷贝

Java 中的深拷贝和浅拷贝是针对对象复制而言的。

浅拷贝(Shallow Copy)

当对象进行浅拷贝时,只会复制对象本身和其中的基本数据类型属性,而不会复制引用对象的实际内容。具体而言,浅拷贝只会创建一个新的对象,并将原始对象中非静态字段的值复制到新对象中。如果该字段是引用类型,则仍然保留该引用,而不是创建一个新对象并将该引用指向新对象。

class Example implements Cloneable {public int num;public String str;public Object obj;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}class Main {public static void main(String[] args) {Example ex1 = new Example();ex1.num = 2;ex1.str = "Hello";ex1.obj = new Object();try {Example ex2 = (Example) ex1.clone();System.out.println(ex1.obj == ex2.obj); // true, both point to the same object.} catch (CloneNotSupportedException e) {e.printStackTrace();}}
}

在上面的示例中,我们可以看到 ex1 和 ex2 都有相同的值(整数 2 和字符串"Hello"),并且它们都引用了相同的 obj 对象。这说明在进行浅拷贝时,obj 对象没有被复制,而是被共享。

深拷贝(Deep Copy)

相反,当对象进行深拷贝时,完全复制对象及其引用对象的实际内容,而不是只复制引用。具体而言,深拷贝将创建一个新对象,并递归地复制原始对象及其所有子对象中的所有字段和可变对象。这样,原始对象和副本之间就不存在任何共享对象。

import java.io.*;class MyClass implements Serializable {public int num;public String str;public MyClass(int num, String str) {this.num = num;this.str = str;}@Overridepublic String toString() {return "MyClass{" +"num=" + num +", str='" + str + '\'' +'}';}
}public class Main {public static void main(String[] args) throws IOException, ClassNotFoundException {MyClass original = new MyClass(123, "Hello World");//使用序列化进行深拷贝ByteArrayOutputStream baos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(baos);oos.writeObject(original);ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bais);MyClass deepCopy = (MyClass) ois.readObject();//检查深拷贝是否成功System.out.println("原始对象: " + original);System.out.println("深拷贝后对象: " + deepCopy);//改变原始对象数据,检查是否影响到了深拷贝对象original.num = 321;original.str = "Goodbye World";System.out.println("修改后的原始对象: " + original);System.out.println("深拷贝后对象: " + deepCopy);}
}

执行结果
原始对象: MyClass{num=123, str=‘Hello World’}
深拷贝后对象: MyClass{num=123, str=‘Hello World’}
修改后的原始对象: MyClass{num=321, str=‘Goodbye World’}
深拷贝后对象: MyClass{num=123, str=‘Hello World’}

该示例中定义了一个自定义类 MyClass ,并实现了 Serizalizable 接口。接着,在 main 方法中,创建了一个 original 对象作为原始对象,然后使用序列化的方式进行深拷贝,将 original 拷贝到 deepCopy 中。最后,通过修改原始对象检查是否会影响到深拷贝对象。

相关文章:

Java 深拷贝和浅拷贝

Java 中的深拷贝和浅拷贝是针对对象复制而言的。 浅拷贝(Shallow Copy) 当对象进行浅拷贝时,只会复制对象本身和其中的基本数据类型属性,而不会复制引用对象的实际内容。具体而言,浅拷贝只会创建一个新的对象&#x…...

[ruby on rails] docker

docker安装 ubuntu14.04后自带docker安装包,可以直接安装 sudo apt-get updatesudo apt-get install -y docker.io# 安装后启动sudo service docker start查看docker信息 docker infodocker命令 sudo service docker start sudo service docker stop sudo servic…...

网络协议——STP协议是什么?是如何实现的?

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 目录 一、STP协议是什么 二、为什么需要STP协议 三、STP的实现过程 ​编辑 1、选举跟桥 2、给非跟桥交换机选举跟端口 3、给每个网段选…...

【C++】智能指针 学习总结 |std::shared_ptr |std::unique_ptr | std::weak_ptr

文章目录 前言一、智能指针介绍二、普通指针和智能指针的比较案例三、std::shared_ptr四、std::unique_ptr五、std::weak_ptr六、std::shared_ptr |std::unique_ptr | std::weak_ptr三大智能指针的区别 前言 参考答案:chatgpt 一、智能指针介绍 智能指针是C的一种…...

iptables防火墙

文章目录 一.linux防火墙基础1.linux 包过滤防火墙概述1.1netfilter1.2 iptables 2.包过滤的工作层次2.1 通信的五元素和四元素 3.iptables 的表、链结构3.1 规则链3.2 默认包括5种规则链3.3 规则表3.4 默认包括4个规则表 二.数据包过滤的匹配流程1.规则表之间的顺序2.规则链之…...

properties、yaml作为配置文件的特点

说明:在软件开发中,经常需要把一些配置写在文件中,如数据库配置、MyBatis配置等。这样,后续如果数据库参数有改动,就可以避免直接对代码做修改,只要修改配置文件中关于数据库的配置。关于配置文件的选择&am…...

JavaSE-03 【流程控制语句】

文章目录 JavaSE-03 【流程控制语句】第一章 流程控制1.1 流程概述1.2 顺序结构 第二章 判断语句2.1 判断语句---if2.2 判断语句---if...else2.3 判断语句---if...else if ... else 第三章 选择语句3.1 选择语句--switch3.2 case的穿透性 第四章 循环语句4.1 循环概述4.2 循环语…...

笔记本电脑的BIOS是怎么保护安全的?

随着攻防技术的不断演进,像BIOS攻击、高级网络代码攻击等手段层出不穷,“受害者”也不仅限于企业级服务器、存储,很多魔爪也开始伸向了拥有商业机密数据的PC。 BIOS是Basic Input/Output System(基本输入/输出系统)的…...

Xubuntu之将rm删除内容移至回收站(一百七十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

STM32F407实现1588v2(ptpd)

硬件: STM32F407ZGT6开发板 软件: VSCode arm-none-eabi-gcc openOCD st-link 在github搜到一个在NUCLEO-F429ZI开发板上移植ptpd的example,因为和F407差别很小,所以就打算用这个demo移植到手头的开发板上。因为目前只需要…...

架构师如何找到自己的商业模式

作为一个架构师,必须要在有限的资源下最大化架构活动所带来的商业价值。对于任何一个架构活动而言,架构师的可用资源,包括商业成本、研发成本、时间成本、迁移成本等等,都是非常有限的。但架构活动就是要在这些限制条件之下&#…...

SQLServer2022安装(Windows),已验证

一、SQLServer2022下载 1、官网下载地址 SQL Server 下载 | Microsoft 2、下载安装包 2.1、选择Developer版本,立即下载。 2.2、打开下载文件夹,双击运行SQL2022-SSEI-Dev.exe 尝试运行SQL2022-SSEI-Dev.exe,会收到以下信息:“…...

facenet, dlib人脸识别,人体检测,云数据库mysql,QQ邮箱,手机验证码,语音播报

目录 部分代码展示: 录入部分 识别部分​编辑 活体检测部分​编辑 同步到云数据库MySQL 其他操作 部分图片展示: 完整代码加ui链接: 涉及到的一些知识点的文章 部分代码展示: 录入部分 识别部分 活体检测部分 同步到云数…...

Spring Boot 面试题——定时任务

目录 1.什么是 cron 表达式?如何使用?2.Scheduled 注解有什么作用?3.介绍一下 spring-boot-starter-quartz。4.在 Spring Boot 中如何实现定时任务?4.1.使用 Schedule 注解4.2.Quartz 框架 1.什么是 cron 表达式?如何使…...

总建面64万平,配3所幼儿园+54班九年制学校,坪山江岭竹元规划

近日,坪山区城市更新和土地整备局发布,关于《坪山区马峦街道江岭竹元片区城市更新单元规划》已通过深圳市城市规划委员会法定图则委员会审批。现予以公告。 项目位于坪山区马峦街道,南邻南坪快速路,北邻比亚迪路,东西两…...

python3 爬虫相关学习7:使用 BeautifulSoup下载网页图片到本地文件夹

目录 1 一个爬图片pic的代码的例子 1.1 学习的原文章 1.2 原始代码的问题总结 问题1 问题2 问题3 其他问题 1.3 原始代码 2 直接在cmd里 python运行报错 和 处理 2.1 运行报错 2.2 报错原因: 没有提前安装这个bs4 模块 2.3 如何提前知道我的python环境…...

windows平台python脚本执行环境搭建笔记

1.python脚本环境下载 这里是原始发布源: https://www.python.org/downloads/release/python-3114/https://www.python.org/downloads/release/python-3114/安装时记得添加进系统path,这样你可以随时调用python环境。 2.扩展模块的安装 step1.找到py…...

MyBatis的动态SQL之OGNL(Object-Graph Navigation Language)表达式以及各种标签的用法

MyBatis的动态SQL 1、if标签的用法2、choose标签的用法3、where标签4、set标签5、trim的用法6、foreach标签7、bind标签 使用过JDBC或者是其他的ORM框架的开发者都知道,在很多操作中都需要去根据具体的条件进行SQL语句的拼接,并且在有些时候一些标点符号…...

基于Java+Springboot+Vue的二次元商城网站设计与实现

博主介绍:✌擅长Java、微信小程序、Python、Android等,专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案…...

MyBatis操作数据库实现

说明:MyBatis是作用于三层架构开发,数据访问层(Data Access Object)的框架,用于访问数据库,对数据进行操作。 一、环境搭建 首先,创建一个SpringBoot模块,然后把MyBatis的环境搭建…...

手把手教你用STM32驱动迪文屏:从RS232配置到页面控件交互全流程

STM32与迪文屏深度开发实战:工业级GUI交互全解析 迪文屏作为工业控制领域广泛采用的HMI解决方案,其与STM32的协同工作能力已成为嵌入式开发者的必备技能。不同于传统TFT-LCD的简单驱动,迪文屏通过串口协议实现的动态交互,为设备控…...

2026年隧道代理技术解析与主流服务商测评

凌晨两点,某美妆品牌运营小李被手机告警震醒——大促期间的竞品价格采集任务又断了。日志里满是403报错,手动切换了几个代理IP,任务勉强恢复,可第一波流量高峰的数据已经错过了。这不是小李第一次遇到这种麻烦,也不是个…...

MAAAssistantArknights:智能自动化的明日方舟游戏助手解决方案

MAAAssistantArknights:智能自动化的明日方舟游戏助手解决方案 【免费下载链接】MaaAssistantArknights 一款明日方舟游戏小助手 项目地址: https://gitcode.com/GitHub_Trending/ma/MaaAssistantArknights 价值解析:如何通过三大核心技术解决玩家…...

LuckyLilliaBot:NTQQ的终极OneBot协议插件完整指南

LuckyLilliaBot:NTQQ的终极OneBot协议插件完整指南 【免费下载链接】LuckyLilliaBot NTQQ的OneBot API插件 项目地址: https://gitcode.com/gh_mirrors/li/LuckyLilliaBot LuckyLilliaBot是一个基于TypeScript开发的NTQQ插件,为QQ客户端提供完整的…...

别再手动算置信区间了!ArcGIS里用Python脚本批量计算FVC,效率提升90%

遥感植被覆盖度自动化计算:用Python脚本解放ArcGIS生产力 当面对数百景遥感数据需要计算植被覆盖度(FVC)时,手动操作ArcGIS界面不仅耗时费力,还容易因人为失误导致结果不一致。我曾在一个省级生态评估项目中,需要处理3年共36期Lan…...

AI Agent与传统RPA工具区别:深度解析企业智能自动化的代际跃迁

在人工智能技术从大语言模型的“对话式交互”向“行动式智能体”跨越的关键周期内,AI Agent(智能体)与传统 RPA(机器人流程自动化)工具的区别已成为企业数字化转型的核心议题。这一区别不仅体现在技术架构的演进上&…...

Go语言依赖管理:从GOPATH到Go Modules

Go语言依赖管理:从GOPATH到Go Modules 作为一个写了十几年代码的Go后端老兵,我经历了Go语言依赖管理的从GOPATH到Go Modules的转变,踩了不少坑。今天就来分享一下Go语言依赖管理的实践经验。 一、依赖管理的演进 1. GOPATH时代 在Go 1.11之前…...

不止于步骤:用SPM预处理fMRI数据时,那些没人告诉你的‘隐藏’技巧与效率工具

不止于步骤:用SPM预处理fMRI数据时,那些没人告诉你的‘隐藏’技巧与效率工具 当你面对上百个被试的fMRI数据时,是否曾为重复点击SPM的GUI界面而感到疲惫?是否担心手动操作带来的潜在错误?本文将带你超越基础教程&#…...

别再死记硬背了!用Treap(树堆)搞定LeetCode平衡树难题,附C++完整模板

Treap实战指南:用随机化平衡树高效解决LeetCode难题 1. 为什么选择Treap而非传统平衡树? 在算法竞赛和面试场景中,我们经常需要处理动态有序集合的操作。传统平衡树如AVL和红黑树虽然能保证严格的平衡性,但它们的实现复杂度往往让…...

SpringCloud Eureka停更了,我为什么还在用它做微服务注册中心?

SpringCloud Eureka停更后,为什么它仍是微服务架构的隐秘王牌? 当Netflix在2018年宣布停止维护Eureka时,整个Java微服务社区都为之震动。五年过去了,这个"过时"的组件却依然活跃在众多企业的生产环境中。上周我参与了一…...