浅拷贝导致的bug
深拷贝与浅拷贝区别
在 Java 中,除了基本数据类型(元类型)之外,还存在类的实例对象这个引用数据类型。而一般使用 『 = 』号做赋值操作的时候。对于基本数据类型,实际上是拷贝的它的值,但是对于对象而言,其实赋值的只是这个对象的引用,将原对象的引用传递过去,他们实际上还是指向的同一个对象。
而浅拷贝和深拷贝就是在这个基础之上做的区分,如果在拷贝这个对象的时候,只对基本数据类型进行了拷贝,而对引用数据类型只是进行了引用的传递,而没有真实的创建一个新的对象,,则认为是浅拷贝。反之,在对引用数据类型进行拷贝的时候,创建了一个新的对象,并且复制其内的成员变量,则认为是深拷贝。
hutool BeanUtil.copyProperties 浅拷贝问题重现
@Test
public void testCopy(){
Student.Transcript transcript = Student.Transcript.builder().score(100).build();
Student student = Student.builder().id(1).transcript(transcript).build();
System.out.println("student = " + student);
Student copyStudent = BeanUtil.copyProperties(student,Student.class);
System.out.println("copyStudent = " + copyStudent);
Student.Transcript studentTranscript = student.getTranscript();
studentTranscript.setScore(99);
student.setId(2);
System.out.println("student = " + student);
System.out.println("copyStudent = " + copyStudent);
}
@Builder
@Data
static class Student{
Integer id;
Transcript transcript;
@Builder
@Data
static class Transcript{
int score;
}
}
执行结果
student = Student(id=1, transcript=Student.Transcript(score=100))
copyStudent = Student(id=1, transcript=Student.Transcript(score=100))
student = Student(id=2, transcript=Student.Transcript(score=99))
copyStudent = Student(id=1, transcript=Student.Transcript(score=99))
在代码中,我们对原有的student实例进行了两个修改,分别是id赋值为2,student内的transcript score重新赋值。
从执行结果可以看到,在对student实例Transcript对象进行修改后,复制得到的copyStudent也发生了相应的变动,但copyStudent的id仍然是1,没有跟随student的id。
实现深拷贝的一些工具
浅拷贝导致的bug的更多相关文章
- 对 Python 语法不够了解导致的 bug
对 Python 语法不够了解导致的 bug. `in` '20' in '11264,6144,4096,3072,2048,1024,300,30' Out[7]: True a_list = ' ...
- MySQL中char(36)被认为是GUID导致的BUG及解决方案
MySQL中char(36)被认为是GUID导致的BUG及解决方案 有时候在使用Toad或在程序中,偶尔会遇到如下的错误: System.FormatException GUID 应包含带 4 个短划 ...
- 请慢慢移动……由于操作快慢导致的bug
最近的工作中,遇到一个由于操作快慢不同导致的bug,原因是,操作慢的时候程序接收到了停止操作,继续处理正确,而快速操作的时候程序来不及处理操作停止的动作,导致需要传入的数据值已经改变,程序报错.这种缺 ...
- 基于antd封装一个高可用form组件 减少cv代码导致的bug
引言 在开发中台过程中 我们的原型中有很多表单,antd有表单组件,但是粒度比较细,就单纯组件而言,无可厚非,但是在开发过程中,可能会造成代码不够聚合,有些表单公共逻辑无法提取,copy paste比 ...
- macOS 升级后导致 dart bug
macOS 升级后导致 dart bug macOS 10.15.5 $ demo_app git:(master) flutter doctor # /Users/xgqfrms-mbp/Docum ...
- 在docker以FPM-PHP运行php,慢日志导致的BUG分析
问题描述: 最近将IOS书城容器化,切换流量后.正常的业务测试了一般,都没发现问题.线上的错误监控系统也没有报警,以为迁移工作又告一段落了,暗暗的松了一口气.紧接着,报警邮件来了,查看发现是一个苹果支 ...
- Java 一个关于使用&&导致的BUG
二维数据track的定义: byte[][] track = new byte[10][10]; 本意:判断track[trackY][trackX]的值是否为零,以及trackX是否小于10. 带B ...
- 高并发压力下导致数据库bug
环境信息: linux 6.1 + oracle11.2.0.3 RAC 问题现象: 学校晚上6点选课,人数大概有3000,7点时,数据库报错如下(数据库到6点多还是可以连接的),数据库hu ...
- 优化代码,引发了早期缺陷导致新bug
早期系统有个缺陷,调用js时少提交一个参数,导致该参数一直是undefined,但是不会引起bug. 对系统进行优化后,这个参数变成了必要的,然后代码一直会走else,undefined值明显不是一个 ...
- 结构体类型重声明导致的bug一个
bug前提条件 当模块比較多.头文件较多,某个结构体类型会在当前模块中又一次声明进而引用其成员,而不直接包括其它模块的头文件. 这种优点是不引入不须要的类型声明到此模块.头文件包括的交叉:坏处是,添加 ...
随机推荐
- Springboot 2.3.1配置拦截器遇到的坑
1.多个配置类继承WebConfigureSupport或实现WebConfigure接口导致拦截器失效 2.拦截器中的bean无法正常注入,SpringBoot项目的Bean装配默认规则是根据App ...
- Py2neo:一种快速导入百万数据到Neo4j的方式
Py2neo:一种快速导入百万数据到Neo4j的方式 Py2neo是一个可以和Neo4j图数据库进行交互的python包.虽然py2neo操作简单方便,但是当节点和关系达几十上百万时,直接创建和导入节 ...
- 多进程TCP服务端并发- 进程join方法 - IPC机制
目录 同步与异步 阻塞与非阻塞 综合使用 创建进程的多种方式 进程间数据隔离 进程join方法 IPC机制 生产者消费者模型 进程对象的多种方法 僵尸进程与孤儿进程 守护进程 多线程实现TCP服务端并 ...
- this关键字在JAVA和JS中的异同
this在JS中的用法 由于js中this 是在运行期进行绑定的,所以js中的 this 可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaScript 中函数的调用有以下几种 ...
- vba 正则表达式用法
Sub Regexp_test(Sht As String, str As String)On Error Resume NextDim regx As ObjectDim arr, brr, mhS ...
- 如何5分钟上手使用PaddleSeg人像抠图
随便打开一个Microsoft Visual Studio,新建一个WinForms项目,从下面列表中随便选择一个NET框架. net35;net40;net45;net451;net452;net4 ...
- docker registry(私库)搭建,使用,WEB可视化管理部署
Docker Registry 是Docker官方一个镜像,可以用来储存和分发Docker镜像.目前比较流行的两个镜像私库是Docker Registry ,HarBor 其中HarBor最合适企业级 ...
- 前端知识之JS(javascirpt)
目录 JS简介 JS基础 1.注释语法 2.引入JS的多种方式 3.结束符号 变量与常量 基本数据类型 1.数字类型(Number) 2.字符类型(string) 3.布尔类型(Boolean) 4. ...
- python运算符与基本数据类型
Python种类 JavaPython cPython ***** pypy 字节码 和 机器码 Python程序: 1. 终端: C:\python35\python.exe D:\1.py 解释器 ...
- DPDK编译与演示
环境 安装dpdk 安装依赖 环境配置 编译 遇到过的问题 dpdk使用 设置hugepage helloworld演示 遇到问题 timer演示 环境 虚拟机系统:ubuntu:1404 安装dpd ...