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>
我们发现也可以实现深拷贝~
以上就是深拷贝和浅拷贝的全部内容,希望你能有所收获~