Java中深拷贝和浅拷贝详解学习

一、什么是深拷贝?什么是浅拷贝?

Java中深拷贝和浅拷贝都是与Java中对象的复制有关。Java 中的深拷贝和浅拷贝通常通过实现 Cloneable 接口并重写 clone() 方法来实现。

浅拷贝:

在浅拷贝中,只有对象的基本数据类型属性被复制,而对象的引用类型属性则只是被复制了引用。这意味着新对象和原对象共享引用类型对象。

深拷贝:

在深拷贝中,会递归地复制对象及其所有子对象(无论是基本数据类型还是引用对象),确保新对象与原始对象完全独立。

二、浅拷贝示例

@Data
public class Teacher implements Cloneable{private String name;private int age;private School school;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public Teacher(String name, int age, School school) {this.name = name;this.age = age;this.school = school;}
}@Data
@Accessors(chain = true)
public class Teacher implements Cloneable{private String name;private int age;private School school;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();      //浅拷贝}public Teacher(String name, int age, School school) {this.name = name;this.age = age;this.school = school;}
}@Slf4j
public class Main {public static void main(String[] args) throws CloneNotSupportedException {School school = new School("AAA School");Teacher teacher = new Teacher("Alice", 20, school);Teacher backTeacher = (Teacher) teacher.clone();backTeacher.setName("Tom");backTeacher.setAge(18);backTeacher.getSchool().setName("BBB School");//将对象序列化为json字符串进行日志打印String jsonTeacher = JSON.toJSONString(teacher);String jsonBackTeacher = backTeacher.toString();log.info("[Teacher] jsonTeacher name is : {}", jsonTeacher);log.info("[Teacher] jsonBackTeacher name is : {}", jsonBackTeacher);}
}

输出结果:

15:46:02.300 [main] INFO com.example.demo.entity.Main - [Teacher] teacher name is : {"age":20,"name":"Alice","school":{"name":"BBB School"}}
15:46:02.303 [main] INFO com.example.demo.entity.Main - [Teacher] teacher name is : Teacher(name=Tom, age=18, school=School(name=BBB School))

可以看到浅拷贝后,基本的数据类型修改没有影响,而对于引用对象数据修改后,原对象和复制的对象会联动修改

三、深拷贝示例

@Data
@Accessors(chain = true)
public class Teacher implements Cloneable{private String name;private int age;private School school;@Overrideprotected Object clone() throws CloneNotSupportedException {Teacher cloneTeacher = (Teacher) super.clone();cloneTeacher.school = (School) school.clone(); //深拷贝School对象return cloneTeacher;}public Teacher(String name, int age, School school) {this.name = name;this.age = age;this.school = school;}
}@Data
@Accessors(chain = true)
public class School implements Cloneable{private String name;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}public School(String name) {this.name = name;}
}@Slf4j
public class Main {public static void main(String[] args) throws CloneNotSupportedException {School school = new School("AAA School");Teacher teacher = new Teacher("Alice", 20, school);Teacher backTeacher = (Teacher) teacher.clone();backTeacher.setName("Tom");backTeacher.setAge(18);backTeacher.getSchool().setName("BBB School");//将对象序列化为json字符串进行日志打印String jsonTeacher = JSON.toJSONString(teacher);String jsonBackTeacher = backTeacher.toString();log.info("[Teacher] jsonTeacher name is : {}", jsonTeacher);log.info("[Teacher] jsonBackTeacher name is : {}", jsonBackTeacher);}
}

输出结果:

16:49:45.213 [main] INFO com.example.demo.entity.Main - [Teacher] jsonTeacher name is : {"age":20,"name":"Alice","school":{"name":"AAA School"}}
16:49:45.215 [main] INFO com.example.demo.entity.Main - [Teacher] jsonBackTeacher name is : Teacher(name=Tom, age=18, school=School(name=BBB School))

可以看到深拷贝后,原对象和拷贝后的对象无论是基本数据还是引用对象的数据都相互独立,互不影响。

四、项目中如何实现深拷贝

在项目中会借助fastjson库通过序列化+反序列化的方式实现对于复制对象的深拷贝
代码示例如下:

@Slf4j
public class Main {/*** 借助fastjson库 通过序列化 + 反序列化的方式实现对象的深拷贝** @param object* @param <T>* @return*/public static <T> T deepCopy(T object) {String jsonString = JSON.toJSONString(object);return JSON.parseObject(jsonString, (Class<? extends T>) object.getClass());}public static void main(String[] args) throws CloneNotSupportedException {School school = new School("AAA School");Teacher teacher = new Teacher("Alice", 20, school);//Teacher backTeacher = (Teacher) teacher.clone();Teacher backTeacher = deepCopy(teacher);backTeacher.setName("Tom");backTeacher.setAge(18);backTeacher.getSchool().setName("BBB School");//将对象序列化为json字符串进行日志打印String jsonTeacher = JSON.toJSONString(teacher);String jsonBackTeacher = backTeacher.toString();log.info("[Teacher] jsonTeacher name is : {}", jsonTeacher);log.info("[Teacher] jsonBackTeacher name is : {}", jsonBackTeacher);}
}

输出结果:

17:27:21.649 [main] INFO com.example.demo.entity.Main - [Teacher] jsonTeacher name is : {"age":20,"name":"Alice","school":{"name":"AAA School"}}
17:27:21.653 [main] INFO com.example.demo.entity.Main - [Teacher] jsonBackTeacher name is : Teacher(name=Tom, age=18, school=School(name=BBB School))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/17994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Clickhouse 嵌套数据类型总结—— Clickhouse 基础篇(三)

文章目录 创建嵌套类型的表插入读取数据在嵌套类型上使用数组函数 在 clickhouse 中存储嵌套类型的关键字是 Nested, 只支持一级嵌套。数据结构类似于在数据结构类似于在表的单元格里面嵌套“一张表格”&#xff0c;如下图所示&#xff1a; 嵌套类型是列存储&#xff0c;本质…

【传知代码】遵循人类指令的高质量图像修复(论文复现)

前言&#xff1a;在数字化时代的浪潮中&#xff0c;图像已成为我们生活中不可或缺的一部分。它们记录着我们的记忆&#xff0c;传递着信息&#xff0c;甚至塑造着我们的认知。然而&#xff0c;正如生活中难以避免的瑕疵&#xff0c;这些数字图像也时常因为各种原因出现损伤、失…

每小时电量的计算sql

计算思路&#xff0c;把每小时的电表最大记录取出来&#xff0c;然后用当前小时的最大值减去上个小时的最大值即可。 使用了MYSQL8窗口函数进行计算。 SELECT b.*,b.epimp - b.lastEmimp ecValue FROM ( SELECT a.deviceId,a.ctime,a.epimp, lag(epimp) over (ORDER BY a.dev…

RangeNet++ 检测3D点云语义算法的详细配置和常见问题

配置环境&#xff1a; Ubuntu18.04 GPU&#xff1a;GeForce MX150 驱动&#xff1a;Ubuntu推荐的nvidia-driver-470 Cuda10.1 cudnn7.6.2 TensorRT 5.1.5.0GCC 7.5.0 运行代码&#xff1a; RangeNet 目录 目录 一、环境配置 1. Ubuntu 18.04 安装NVIDIA驱动 &…

蒲公英旁路组网:总部旁路,分部一级组网方案

总部网关下连接蒲公英路由&#xff0c;分部主机安装蒲公英客户端。总部和分部登录相同账号异地组网。 总部路由地址192.168.1.10&#xff0c;10.168.1.1&#xff0c;172.16.2.5&#xff0c;分部主机地址192.168.43.2&#xff0c;172.16.2.25。 分部主机已经自动添加了路由&am…

基于Vue uni-app的自定义列表表格信息展示组件

摘要&#xff1a;随着软件技术的不断发展&#xff0c;前端开发面临着越来越多的挑战。特别是在业务场景复杂多变的情况下&#xff0c;如何提高开发效率和降低维护成本成为了关键。本文旨在探讨组件化开发在前端应用中的重要性&#xff0c;并以Vue uni-app自定义列表表格为例&am…

R语言lavaan结构方程模型(SEM)

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;是分析系统内变量间的相互关系的利器&#xff0c;可通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、…

vue3 ts typescript 路由报错 is not assignable to parameter type RouterOptions

解决方法&#xff1a; import { createRouter, createWebHistory } from vue-router import type {RouterOptions} from vue-routerimport HomeView from ../views/HomeView.vueconst router createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{p…

React Native 之 像素比例(十七)

在 React Native 中&#xff0c;PixelRatio 是一个用于获取设备像素比&#xff08;Pixel Ratio&#xff09;的实用工具。像素比&#xff08;或称为设备像素密度、DPI 密度等&#xff09;是物理像素和设备独立像素&#xff08;DIPs 或 DPs&#xff09;之间的比率。设备独立像素是…

I.MX6ULL模仿 STM32 驱动开发格式实验

系列文章目录 I.MX6ULL模仿 STM32 驱动开发格式实验 I.MX6ULL模仿 STM32 驱动开发格式实验 系列文章目录一、前言二、模仿 STM32 寄存器定义2.1 STM32 寄存器定义简介2.2 I.MX6Ul 寄存器定义2.3硬件原理图2.4实验程序编写 三、编译下载验证 一、前言 使用 C 语言编写 LED 灯驱…

2024年中国金融行业网络安全市场全景图

网络安全一直是国家安全的核心组成部分&#xff0c;特别是在金融行业&#xff0c;金融机构拥有大量的敏感数据&#xff0c;包括个人信息、交易记录、财务报告等&#xff0c;这些数据的安全直接关系到消费者的利益和金融市场的稳定&#xff0c;因此金融行业在网络安全建设领域一…

SSL协议:网络安全通信的守护者

在网络通信迅猛发展的今天&#xff0c;数据安全和隐私保护变得尤为重要。安全套接层协议&#xff08;Secure Sockets Layer, SSL&#xff09;作为早期网络加密及身份验证的基石&#xff0c;为在线数据传输提供了安全保障。下面我们就来了解一下SSL协议。 SSL协议概述 SSL协议最…

LIBRARIES: 彻底解决conda install慢的问题

来源&#xff1a; “码农不会写诗”公众号 链接&#xff1a;LIBRARIES: 彻底解决conda install慢的问题 文章目录 01 conda升级02 设置mamba solver03 换源 conda install conda install是Anaconda平台的包管理命令&#xff0c;用于安装第三方库。conda是Anaconda平台默认的包管…

[nextjs]推荐几个很好看的模板网站

最近在做网站,折腾了 vue 框架,然后发现了 nextjs 框架,感觉这个做出来的网站配色很好看,然后又开始研究这个 网站配色好看是因为用的 tailwindcss,找网站过程中,发现了几个很好看的模板网站,在这里推荐下,或许你也能用得上 推荐第一个网站是: https://tailspark.co/ 有组件,也…

前端项目性能优化:工程化环境中将图片转为base64(vite插件)

一、优化原理 通过将图片转为base64的形式来减少请求&#xff0c;实现性能优化。 考虑到过大的图片转为base64形式会导致加载时间过长&#xff0c;反而会影响性能&#xff0c;所以需要对转化的图片的大小进行限制。 每次去使用图片的时候都去手动转化一次是很麻烦的&#xf…

python--pycharm中将venv删除后怎么办

在终端中输入以下命令来创建一个新的虚拟环境&#xff08;可选&#xff09;&#xff1a; python -m venv venv 激活虚拟环境&#xff1a; Windows: .\venv\Scripts\activate选择自己项目的虚拟环境

Java 使用WebMagic爬取网页(简单示例)

框架简介 WebMagic是一个基于Java的开源网络爬虫框架&#xff0c;它提供了很多简单易用的API接口&#xff0c;可以帮助使用者快速构建出高效、可扩展的网络爬虫程序&#xff0c;WebMagic由四个组件(Downloader、PageProcessor、Scheduler、Pipeline)构成&#xff0c;核心代码非…

HLS入门(Xilinx Vivado 2019.2)——点亮LED仿真

HLS入门——点亮LED仿真 一、HLS简介&#xff08;一&#xff09;什么是HLS&#xff1f;&#xff08;二&#xff09;HLS能做什么&#xff1f;&#xff08;三&#xff09;HLS的使用&#xff08;四&#xff09;HLS的优势&#xff08;五&#xff09;HLS与VHDL/Verilog编程技术的关系…

火绒日志提示被局域网爆破攻击怎么找出攻击程序?

火绒日志提示被局域网爆破攻击&#xff0c;这通常意味着您的网络可能正在遭受某种形式的恶意扫描或尝试破解。为了找出攻击程序&#xff0c;您可以采取以下步骤&#xff1a; 查看火绒日志详情&#xff1a; 打开火绒安全软件&#xff0c;查看详细的日志记录。了解攻击发生的时间…

在矩池云上使用StoryDiffusion的详细方法

StoryDiffusion 是由南开大学和字节跳动团队联合研发的&#xff0c;基于一致性自注意力机制生成长跨度图像和视频的新型扩散模型&#xff08;Consistent Self-Attention for Long-Range Image and Video Generation&#xff09;&#xff0c;使用者不需要进行额外训练&#xff0…