结合场景,浅谈深浅度拷贝

   有两段代码是这样的:

A段:

List<String> list1 = new ArrayList<>();
Bear B = new Bear();
for(Apple apple : apples){B.url = apple.url;B.content = apple.content;list1.add(Bear);
}

B段:

List<String> list1 = new ArrayList<>();
for(Apple apple : apples){
Bear B = new Bear();B.url = apple.url;B.content = apple.content;list1.add(Bear);
}

显而易见,这两段代码的区别在于Bear对象的创建的位置不同,第一段代码里面,先创建了一个 Bear 对象 B,然后在循环中不断更新 B 的属性,并将同一个 B 对象多次添加到 list1 中。由于 list1 中存储的是对象的引用,因此最终 list1 中存储的是多个指向同一个 Bear 对象的引用。

而第二段代码中,我们在每次循环中都创建了一个新的 Bear 对象 B,并将其添加到 list1 中。因此,list1 中存储的是多个不同的 Bear 对象的引用。

所以,其实两次list的存储的Bear对象结果会是不同的,第一段代码存了一堆一样的Bear,那么问题来了:我想不重复创建Bear对象,但是也能达到第二段效果,应该怎么做?

答案是使用深度拷贝;

在修复代码之前,深浅度拷贝的定义我们复习下:

浅拷贝(Shallow Copy):

  • 浅拷贝是指在复制对象时,只复制对象本身和其内部引用的对象的引用,而不复制引用的对象本身。
  • 在浅拷贝中,新对象和原对象共享内部引用的对象,即新对象和原对象的引用指向同一个内部对象。
  • 如果原对象的属性是基本数据类型,那么浅拷贝会复制这些属性的值;如果原对象的属性是引用类型,那么浅拷贝只会复制引用,而不会复制引用指向的对象。

深度拷贝(Deep Copy):

  • 深度拷贝是指在复制对象时,不仅复制对象本身,还会递归复制对象内部引用的对象,直到所有引用的对象都被复制。
  • 在深度拷贝中,新对象和原对象的所有引用对象都是独立的,即新对象和原对象的引用指向不同的内部对象。
  • 无论原对象的属性是基本数据类型还是引用类型,深度拷贝都会复制所有属性的值或引用指向的对象。

原理比较:

  • 浅拷贝只复制对象本身和其内部引用的对象的引用,因此新对象和原对象共享内部引用的对象,可能会导致对象之间的状态相互影响。
  • 深度拷贝会递归复制对象内部引用的对象,确保新对象和原对象的所有引用对象都是独立的,避免对象之间的状态相互影响。

那么好,我们基于该原理改造下我们的第一段代码:

首先需要重写Bear对象,重写clone方法:

public class Bear implement Clone{private String url;private String content;//构造函数等省略@Overridepublic Bear clone(){try{Bear cloned = (Bear) super.clone(); // 首先调用父类的 clone 方法进行浅拷贝// 对象的属性进行深度拷贝cloned.url = new String(this.url);cloned.content = new String(this.content);return cloned; }catch(CloneNotSupportedException e){throw new AssertionError();}}}

写完Bear类的clone方法后,就可以用它的clone方法来做对象复制,最终第一段代码改写如下:

List<String> list1 = new ArrayList<>();
Bear originalBear = new Bear(); // 假设有一个原始的 Bear 对象
for(Apple apple : apples){Bear clonedBear = originalBear.clone(); // 使用克隆方法创建新的 Bear 对象clonedBear.url = apple.url;clonedBear.content = apple.content;list1.add(clonedBear);
}

这样修改后,可以避免多次创建新对象,同时确保 list1 中加载不同的 Bear 对象。

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

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

相关文章

Docker Compose常用命令与属性

大家好&#xff0c;今天给大家分享Docker Compose的常用命令&#xff0c;以及docker-compose文件的属性。Docker Compose 是一个用于定义和运行多容器 Docker 应用应用的重要工具。它通过一个配置文件&#xff08;docker-compose.yml&#xff09;来详细定义多个容器之间的关联、…

【信息系统项目管理师】复习~第十四章

14.项目沟通管理 沟通的形式&#xff1a;书面、口头、正式/非正式、手势动作、媒体、遣词造句沟通模型&#xff1a;编码&#xff08;思想→语言&#xff09;、信息和反馈信息、媒介&#xff08;传递&#xff09;、噪声&#xff08;干扰传输和理解&#xff09;、解码&#xff0…

营销管理新突破,店匠科技与TikTok Shop携手深化合作

在全球化浪潮与数字化趋势的推动下,跨境电商已成为众多商家追求增长的新高地。TikTok Shop美国小店(TTS)以其庞大的用户基础和市场规模,成为商家们竞相入驻的热门平台。店匠科技(Shoplazza)作为领先的独立站SaaS服务商,近日宣布与TikTok Shop达成深度合作,为商家带来一站式订单…

docker端口映射成功,docker端口不生效的问题解决,外界无法访问docker映射端口

docker端口映射不生效的问题解决 问题 使用docker run -p 88848:8848后&#xff0c;显示容器启动正常&#xff0c;并且使用docker logs –f xxx能够看到容器可以正常启用&#xff0c;docker ps 可以看到容器启动成功&#xff0c;并且端口已经映射,但是在浏览器访问相关地址&am…

智慧公厕打造智慧城市新标杆

公共厕所作为城市基础设施的重要组成部分&#xff0c;直接关系到市民的生活品质和城市形象。传统的公厕管理方式存在着许多问题&#xff0c;如环境脏乱、清洁不及时等&#xff0c;给市民带来了诸多不便和不满。而智慧公厕作为一种全新的管理模式&#xff0c;通过物联网、大数据…

进程间通信 管道

前言 ubuntu系统的默认用户名不为root的解决方案&#xff08;但是不建议&#xff09;&#xff1a;轻量应用服务器 常见问题-文档中心-腾讯云 (tencent.com) 进程间通信的基本概念 进程间通信目的&#xff1a;进程间也是需要协同的&#xff0c;比如数据传输、资源共享、通知事件…

5、Qt—文件夹的使用小记1

开发平台&#xff1a;Win10 64位 开发环境&#xff1a;Qt Creator 13.0.0 构建环境&#xff1a;Qt 5.15.2 MSVC2019 64位 一、需求及涉及相关类 在开发过程中&#xff0c;或多或少的都会操作到文件&#xff0c;比如配置文件&#xff0c;日志等生成复制操作&#xff0c;在Qt中…

NLP(12)--语言模型

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 应用-语音识别&#xff1a; 声音的本质是一种波&#xff0c;将波按时间段切分为很多帧&#xff0c;之后进行声学特征提取&#xff0c;每一帧转化为向量。 应用-输入法&#xff1a; 按照语言模型给出概率最高的候选词 语言…

2024年化学材料、清洁能源与生物技术国际学术会议(ICCMCEB2024)

2024年化学材料、清洁能源与生物技术国际学术会议(ICCMCEB2024) 会议简介 2024国际化学材料、清洁能源和生物技术大会&#xff08;ICCMCEB2024&#xff09;将在长沙隆重举行。本次会议旨在汇聚来自世界各地的化学材料、清洁能源和生物技术领域的专家学者&#xff0c;共同探…

云服务器空间不足如何解决?

一、清除安装文件 对于已经安装完毕的应用程序&#xff0c;也包括不用的主题和插件&#xff0c;及时删除没有实际用处的安装文件可以节省出许多空间容量&#xff0c;且不影响任何网站运行。 二、删除老旧邮件 除了删除垃圾邮件&#xff0c;过时、无效的邮件也应该定期删除&…

用C++译密码

为使电文保密&#xff0c;往往按一定规律将电文转换成密码&#xff0c;收报人再按约定的规律将其译回原文。例如&#xff0c;可以按以下规律将电文变成密码&#xff1a;将字母A变成字母E,a变成e&#xff0c;即变成其后的第4个字母&#xff0c;W变成A,X变成B,Y变成C,Z变成D。字母…

AT32WB415 AN0077增加可获取蓝牙MAC地址的AT指令

前言 雅特力AT32WB415是一颗集成了蓝牙模组的MCU&#xff0c;支持蓝牙5.0&#xff0c;包括支持拓展数据包&#xff0c;在保证数据传输效率的同时&#xff0c;又能满足对算法和外设资源有要求的应用&#xff0c;雅特力官网有支持AT指令同时也可支持大数据传输的sample code &…

【吃透Java手写】3-SpringBoot-简易版-源码解析

【吃透Java手写】SpringBoot-简易版-源码解析 1 SpringbootDemo2 准备工作2.1 Springboot-my2.1.1 依赖2.1.2 SpringBootApplication2.1.3 SJBSpringApplication2.1.3.1 run方法 2.2 Springboot-user2.2.1 依赖2.2.2 UserController2.2.3 UserApplication 2.3 分析run方法的逻辑…

Vue+OpenLayers7入门到实战:OpenLayers实现鼠标拖拽方式绘制矩形(正方形和长方形)

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上实现鼠标拖拽方式绘制矩形(拖拽方式长方形和正方形)。 OpenLayers本身是可以通过鼠标点击多个点的方式来绘制多边形的,当然也包括长方形和正方形,但是这种多边形绘…

Ollama + Openwebui 本地部署大型模型与交互式可视化聊天

Ollama简介 Ollama是一个创新的平台&#xff0c;它允许用户在本地启动并运行大型语言模型。它提供了一个简单易用的内容生成接口&#xff0c;类似于OpenAI&#xff0c;但无需开发经验即可直接与模型进行交互。Ollama支持热切换模型&#xff0c;为用户提供了灵活性和多样性。 …

知识付费系统题库导入,教育机构怎么做回访,有哪些技巧话术你知道吗?

培训学校的学科教师是学校发展的重要力量&#xff0c;也是服务体系最为尖端、权威的一端&#xff0c;教师与学生及家长之间的日常电话沟通&#xff0c;涉及到学校发展的核心利益&#xff0c;如何发挥教师的作用&#xff0c;为学校营销、服务做出一定的贡献&#xff0c;那么教育…

石家庄河北银行的

有些时候河北石家庄这边的甲方客户人员就是太苛刻了&#xff0c;尤其是银行业 比如河北银行的信息部的卢斌&#xff0c;兰州人&#xff0c;这个人的人品极度恶劣&#xff0c;对乙方的外包人员特别苛刻&#xff0c;像个大爷一样。自己什么都不会&#xff0c;连sql 都不会写&…

港股开启估值修复行情 珠光效果材料龙头大涨25%

进入二季度以来&#xff0c;港股市场持续大涨&#xff0c;仅4月恒生指数就大涨7.4%&#xff0c;5月涨幅继续扩大至12.31%&#xff0c;大幅跑赢全球各主要指数。尤其是随着恒生科技多年以来的估值底部的确认&#xff0c;至此恒生指数、恒生港股通&#xff0c;恒生高股息&#xf…

express 本地https服务 接口、静态文件,并支持跨域

var express require(express); var app express(); //设置跨域访问 app.all(*, function (req, res, next) {res.header(Access-Control-Allow-Origin, *);res.header(Access-Control-Allow-Credentials, true);res.header(Access-Control-Allow-Headers, Content-Type,Cont…

使用C语言实现杨氏矩阵并找出数字

前言 过了五一假期&#xff0c;咋们经过了一个假期的休息&#xff0c;要继续学习了&#xff0c;不能偷懒哦&#xff01;&#xff01; 今天让我们来看看如何在一个杨氏矩阵中找出自己想找到的数字。 首先&#xff0c;我们要了解一下杨氏矩阵到底是什么&#xff0c;如果一个矩阵中…