java深浅拷贝

目录

1、浅拷贝与深拷贝的区别

浅拷贝

深拷贝

2、浅拷贝实现

3、深拷贝实现


来都来了点个赞收藏一下再走呗~~~🌹🌹🌹🌹🌹

1、浅拷贝与深拷贝的区别

浅拷贝

  • 定义:浅拷贝创建了一个新的对象,但是这个新对象的成员变量中引用数据类型仍然指向原对象中相应的成员变量所指向的对象。
  • 实现:直接赋值的方式就是浅拷贝。
  • 特点
    • 浅拷贝是快速的,因为它只是复制了对象的引用。
    • 如果原对象的成员变量引用了可变对象,那么在拷贝对象中修改这些成员变量会影响到原对象。
    • 浅拷贝对于不可变对象是安全的。

深拷贝

  • 定义:深拷贝创建了一个新的对象,并且递归地复制了原对象的所有成员变量,包括引用数据类型指向的对象。
  • 实现:可以通过实现Cloneable接口并重写Object类的clone()方法来实现浅拷贝。,通常需要自定义实现,可能涉及到递归拷贝或使用序列化机制。
  • 特点
    • 深拷贝是耗时的,因为它需要复制对象及其所有引用的对象。
    • 深拷贝创建了一个完全独立的对象副本,修改拷贝对象不会影响原对象。
    • 深拷贝对于包含循环引用的对象可能比较复杂。

2、浅拷贝实现

物料类

package clone;public class Student{private String name;private int age;public Student() {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}
Student s1 = new Student();
s1.setName("s1");
s1.setAge(20);
//浅拷贝
Student s2 = s1;
System.out.println(s1);
System.out.println(s2);
s2.setName("s2");
//s1和s2的name都变成s2
System.out.println(s1.getName());
System.out.println(s2.getName());

浅拷贝的结果输出:

由此我们可以看到实际上的浅拷贝就是把引用类型的地址赋值给创建的对象

3、深拷贝实现

这个地方就讲一种最常用的实现深拷贝的方法,就是实现cloneable接口,并且重写其中的clone方法。

物料类

package clone;public class Student implements Cloneable {private String name;private int age;public Student() {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overrideprotected Student clone() throws CloneNotSupportedException {return (Student) super.clone();}
}
//深拷贝
try {Student s2 = s1.clone();System.out.println(s1);System.out.println(s2);s2.setName("s2");System.out.println(s1.getName());System.out.println(s2.getName());
} catch (CloneNotSupportedException e) {throw new RuntimeException(e);
}

我们可以发现深拷贝是重写创建一个引用类型的对象

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

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

相关文章

数据容器-小结

目录 一、数据容器特点比较 二、数据容器操作小结 1、通用序列操作 2、通用的转换操作 3、案例演示 一、数据容器特点比较 二、数据容器操作小结 1、通用序列操作 2、通用的转换操作 3、案例演示 1)list([iterable]):转换成列表 str_a "…

Vue.js 2 项目实战(八):小黑记事本组件版

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计初衷是通过采用简洁且强大的结构,使前端开发变得更简单和高效。以下是对 Vue.js 的详细介绍: 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面,通过数据绑…

Python酷库之旅-第三方库Pandas(049)

目录 一、用法精讲 176、pandas.Series.rank方法 176-1、语法 176-2、参数 176-3、功能 176-4、返回值 176-5、说明 176-6、用法 176-6-1、数据准备 176-6-2、代码示例 176-6-3、结果输出 177、pandas.Series.sem方法 177-1、语法 177-2、参数 177-3、功能 177…

深入探索Python3网络爬虫:构建数据抓取与解析的强大工具

前言 在当今这个信息爆炸的时代,数据成为了驱动各行各业发展的关键要素。无论是市场分析、用户行为研究,还是内容聚合与推荐系统,都需要从海量的互联网数据中提取有价值的信息。而网络爬虫,作为自动化获取网页数据的技术手段&…

JVM系列(二) -类的加载过程

一、背景介绍 我们知道 Java 是先通过编译器将.java类文件转成.class字节码文件,然后再通过虚拟机将.class字节码文件加载到内存中来实现应用程序的运行。 那么虚拟机是什么时候加载class文件?如何加载class文件?class文件进入到虚拟机后发…

后端解决跨域(Cross-Origin Resource Sharing)(三种方式)

注解CrossOrigin 控制层的类上或者方法上加注解CrossOrigin 实现接口并重写方法 Configuration public class CorsConfig implements WebMvcConfigurer {Overridepublic void addCorsMappings(CorsRegistry registry) {// 设置允许跨域的路径registry.addMapping("/**&qu…

教您批量下载天猫图片信息,节省时间

图片在电商中至关重要,高质量的商品图片能吸引顾客注意,提升购买欲望。好的图片可以直观展示产品特性,帮助消费者了解商品,减少疑问和退换货率。同时,优质的视觉呈现增强品牌形象,提高转化率,促…

【Django】ajax和django接口交互(获取新密码)

文章目录 一、需求1. 效果图 二、实验1. 写get接口后端2. 写html后端3. 写前端4. 测试 一、需求 1. 效果图 二、实验 1. 写get接口后端 写views import string import random def getnewpwd(request):words list(string.ascii_lowercasestring.ascii_uppercasestring.digi…

大模型算法面试题(十三)

本系列收纳各种大模型面试题及答案。 1、微调后的模型出现能力劣化,灾难性遗忘是怎么回事 微调后的模型出现能力劣化,灾难性遗忘(Catastrophic Forgetting)是一个在机器学习领域,尤其是在深度学习和大模型应用中频繁出…

特斯拉财报看点:FSD拳打华为,Robotaxi 脚踢百度

大数据产业创新服务媒体 ——聚焦数据 改变商业 特斯拉发最新财报了,这不仅是一份财务报告,更是一张未来发展的蓝图。在这份蓝图中,两个关键词格外耀眼——FSD(全自动驾驶系统)和Robotaxi(无人驾驶出租车&…

探索科技新境界,体验系统维护的极致自由—蓝屏工具箱4.0全新登场

官网:蓝屏工具箱官网 下载链接:蓝屏工具箱最新版安装包官方版下载 在数字化浪潮席卷全球的今天,软件工具已不仅仅是简单的代码集合,它们如同工匠手中的雕刻刀,精细打磨、雕琢着数字世界的每一个角落。创峄公司深谙此道…

基于多种机器学习算法的短信垃圾分类模型

文章目录 有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主导入第三方库读取数据数据预处理数据分析与可视化机器学习建模贝叶斯逻辑回归支持向量机随机森林XGBoost总结每文一语 有需要本项目的代码或文档以及全部资源,或者部署调试可以私…

【数据结构初阶】单链表经典算法题十二道——得道飞升(中篇)

hi,bro—— 目录 5、 链表分割 6、 链表的回文结构 7、 相交链表 8、 环形链表 【思考】 —————————————— DEAD POOL —————————————— 5、 链表分割 /* struct ListNode {int val;struct ListNode *next;ListNode(int x) : val(x), …

学懂C语言(十八):C语言中数组及其应用

目录 一、数组的概念 二、数组的声明、初始化及访问 1、声明 2、初始化 3、访问数组元素 三、数组的应用 1. 存储和处理数据 2. 字符串处理 3. 多维数组 4. 函数参数 5、注意事项 一、数组的概念 C语言中的数组是一种数据结构,用于存储一…

el-image预览图片点击遮盖处关闭预览

预览关闭按钮不明显 解决方式: 1.修改按钮样式明显点: //el-image 添加自定义类名,下文【test-image】代指 .test-image .el-icon-circle-close{ color:#fff; font-size:20px; ...改成很明显的样式 }2.使用事件监听,监听当前遮…

web前端开发一、VScode环境搭建

1、VScode安装live server插件,写完代码后,保存就会在浏览器自动更新,不需要再去浏览器点击刷新了 2、创建html文件 3、在文件中输入感叹号 ! 4、选择第一个,然后回车,就会自动输入html的标准程序 5、…

我在百科荣创企业实践——简易函数信号发生器(6)

对于高职教师来说,必不可少的一个任务就是参加企业实践。这个暑假,本人也没闲着,报名参加了上海市电子信息类教师企业实践。7月8日到13日,有幸来到美丽的泉城济南,远离了上海的酷暑,走进了百科荣创科技发展有限公司。在这短短的一周时间里,我结合自己的教学经验和企业的…

20240724-然后用idea创建一个Java项目/配置maven环境/本地仓储配置

1.创建一个java项目 (1)点击页面的create project,然后next (2)不勾选,继续next (3)选择新项目名称,新项目路径,然后Finsh,在新打开的页面选择…

IDEA在编译的时候报Error: java: 找不到符号符号: 变量 log lombok失效问题

错误描述 idea因为lombok的报错: java: You arent using a compiler supported by lombok, so lombok will not work and has been disabled.Your processor is: com.sun.proxy.$Proxy8Lombok supports: sun/apple javac 1.6, ECJ 原因:这是由于Lombok的版本过低的…

分布式:RocketMQ/Kafka总结(附下载链接)

文章目录 下载链接思维导图 本文总结的是关于消息队列的常见知识总结。消息队列和分布式系统息息相关,因此这里就将消息队列放到分布式中一并进行处理关联 下载链接 链接: https://pan.baidu.com/s/1hRTh7rSesikisgRUO2GBpA?pwdutgp 提取码: utgp 思维导图