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

java基础-深拷贝和浅拷贝

java中有一个概念叫深拷贝和浅拷贝,那这两个是什么意思呢?其实你可以对比一下c中的传值和传引用的问题。

深拷贝

即两个相同的对象地址不同,比如对象A通过拷贝出来对象B,在对B对象进行操作时不会影响到A对象的内容。

浅拷贝

和深拷贝相反,创建一个对象A,然后通过A对象克隆出对象B,此时A和B两个对象的地址是一样的,即两个对象使用的是同一个地址。

如何实现深拷贝和浅拷贝

浅拷贝的实现

可以使用Beanutils进行浅拷贝,代码如下:

观察结果我们发现,拷贝出来的其实是两个不同的对象,但是他们的值是相同的,此时我们去修改user1中的值,看user中的值是否会发生变化

这时user和user1的值都发生了改变,说明BeanUtils使用的是浅拷贝的方式

深拷贝的实现 

深拷贝实现方式有几种,我们一一进行介绍

实现Cloneable接口,重写clone方法

        这个实现方式其实现在不怎么用,因为想要重写clone方法,就必须要实现Cloneable,不然就会报CloneNotSupportedException异常,而且一旦对象中增加或者删除某个属性,也要相应修改clone方法,所以比较繁琐,因此这里就不做介绍了,感兴趣的同学可以去其他博客上了解~

序列化实现深拷贝

        我们可以把对象序列化成流,然后再反序列化成对象,这样得到的就是一个新对象了,就比如我们可以使用各种json工具将对象序列化成JSON字符串,然后再从字符串中反序列化对象。

要注意的是这里导入的依赖为以下依赖

 <dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.46</version></dependency>

不能是fastjson这个依赖,不然你就会跟我一样喜提一个报错,报错信息如下:

 除此之外,我们还可以使用Apache Commons Lang提供的SerializationUtils工具来实现,首先,我们需要修改一下类:

引入依赖

   <dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency>

我们发现也可以实现深拷贝~

以上就是深拷贝和浅拷贝的全部内容,希望你能有所收获~ 

 

 

http://www.lryc.cn/news/360722.html

相关文章:

  • Java数组操作
  • C++vector及其实现
  • 路由策略实验1
  • 含情脉脉的进程
  • 重复文件怎么查找并清理?电脑重复文件清理工具分享:4个
  • Java中连接Mongodb进行操作
  • LabVIEW远程开发与调试
  • C/C++|基于回调函数实现异步操作
  • Mac上搭建Python环境:深入探索与高效实践
  • 数据标准的制定落地
  • 微信小程序基础 -- 小程序UI组件(5)
  • Linux shell编程学习笔记55:hostname命令——获取或设置主机名,显示IP地址和DNS、NIS
  • 【鸟哥】Linux笔记-硬件搭配
  • 代码随想三刷数组篇
  • windows环境下重建oracle监听
  • 单元测试框架Pytest的基本操作
  • Java web应用性能分析之【java进程问题分析工具】
  • 02-2.3.2_2 单链表的查找
  • 设计模式(十四)行为型模式---访问者模式(visitor)
  • 【Matplotlib作图-3.Ranking】50 Matplotlib Visualizations, Python实现,源码可复现
  • 加入不正确的位置编码会破坏掉原本的信息吗?
  • 区块链合约开发流程
  • 建筑企业有闲置资质怎么办?
  • Java开发-特殊文本文件,日志技术
  • Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
  • 无人机路径规划:基于鸽群优化算法PIO的无人机三维路径规划MATLAB代码
  • ArcGIS属性域和子类型
  • 电子电器架构 --- 什么是域控制器?
  • 链表头部插入结点
  • k8s集群修改apiserver的ip地址