你真的了解java的深浅拷贝吗?

拷贝:就是把A对象的属性值完全拷贝给B对象,也叫对象拷贝和对象复制

那么什么是深浅拷贝呢??我将在下文一一介绍

1.定义

 浅拷贝:不管对象内部的内部属性是引用数据类型还是基本数据类型都完全拷贝过来

深拷贝:基本数据类型拷贝过来,字符串复用,引用数据类型重写创建新的        

 那么到这里,有些人就有疑问了object中的clone()方法是什么拷贝?

是浅拷贝(替换克隆出来的地址值)

2.区别

1.引用数据类型

        浅拷贝:就是只复制某一个对象的指针,而不复制这个对象本身,那么这种复制方式意味着两个引用指针,指向被复制对象的同一块内存地址,

        深拷贝:就是说完全创建一个一模一样的新的对象,新对象和老对象之间不共享任何内存,也就意味着对新对象的修改,不会影响老对象的一个值

2.介绍java里面的深浅克隆

        在java里面无论是深拷贝还是浅拷贝,我们都需要去实现cloneable接口,并且实现clone()方法,然后在clone()方法里面实现浅拷贝或者是深拷贝的一个实现逻辑,实现深拷贝的方法有甚多比如说通过序列化的方式实现,也就是说把一个对象序列化一遍在通过反序列化回来,就会得到一个完整的新对象,或者在clone()方法里面重写克隆的逻辑,也就是说对克隆对象的内部引用变量在进行一次克隆

3.浅拷贝存在的隐患

        如果我们使用了浅拷贝方法,就有可能导致多个线程,同时操作对象,造成数据安全问题,就跟没有锁存在的隐患差不多

以下举个例子来帮助理解:      

        假设你和你的朋友在一起写一个故事,共同维护一个故事本。如果你们使用浅拷贝方法来创建副本,每个人都会持有一个独立的副本。

        现在你和你的朋友正在同时编辑这个故事,你希望将某一段文字加粗,而你的朋友同样也想要修改另一段文字的格式。但是由于你们使用了不同的副本,你不知道他刚刚进行了哪些修改,而他也不知道你的操作。因此,当你们将操作同步到主故事本时,可能会互相覆盖对方的修改结果,导致故事本出现错误或相互冲突的段落。

        这就类似于使用浅拷贝方法同时操作对象存在的问题:每个线程都持有自己的副本,并且相互之间没有协调措施,容易导致数据安全问题。为了保证故事本的正确性,你们需要协调好访问和修改的顺序,避免出现数据错乱或者冲突等问题。

        因此,浅拷贝方法可能导致多个线程同时操作对象,引发数据安全问题,类似于没有锁存在时的隐患。为了确保数据的安全性,我们需要使用适当的并发控制手段,如同步锁或其他线程安全机制。

你可能感兴趣的:(java,开发语言)