java对象深拷贝和浅拷贝(java中深拷贝和浅拷贝)

一、引言复印这个词想必大家都不陌生,工作中经常需要复印一份文件作为文案。复制的好处是显而易见的,和新建相比,可以节省很多工作。在Java中,复制的概念也是存在的,复制的意义在于可以节省创建对象的开销。
对象类中有一个方法克隆()。具体方法如下:
受保护的本机对象clone()引发CloneNotSupportedException此方法由protected修饰。默认情况下,java中的所有类都继承Object类。为了保证其他类可以正常调用,需要将重载的clone()方法的修饰符改为public。这个方法是native方法,native修饰的方法实际上是用非java代码实现的,比普通的Java方法效率更高。这个方法的返回值是Object对象,所以我们需要把它强制转换成我们需要的类型。这个方法抛出一个CloneNotSupportedException异常,表示不支持复制,我们需要实现Cloneable接口来标记。这个类支持复制。为了便于演示,我们新建了两个实体类Dept和User,其中User依赖于Dept,实体类编码如下:
部门类别:
@ Data @ AllArgsConstructor @ NoArgsConstructorpublic class Dept { private int deptNo;私有字符串名称;}用户类别:
@ Data @ AllArgsConstructor @ NoArgsConstructorpublic class User { private int age;私有字符串名称;私人部门;}二。浅抄。对于基本类型的属性,浅层复制会将属性值复制到新对象,而对于引用类型的属性,浅层复制会将引用复制到新对象。然而,诸如字符串和整数之类的引用类型并不是不可变的。复制时,将创建一个新的内存空间来存储值,新的引用将指向新的内存空间。不可变类型是特殊的引用类型。我们就当这些final类型的应用也是复制值吧。
浅拷贝功能的实现
@ Data @ AllArgsConstructor @ NoArgsConstructorpublic类用户实现可克隆的{ private int age私有字符串名称;私人部门;@Override保护对象clone()抛出CloneNotSupportedException { return super . clone();}}如何验证我们的结论?首先,比较复制的对象是否等于原对象。如果不相等,说明是新复制的对象。其次,修改复制对象的基本类型属性。如果修改了原对象的这个属性,就意味着基本类型属性不变。最后,修改复制对象的引用类型对象,即Dept属性。如果原对象的这个属性改变了,说明引用类型属性不变。了解测试原理后,我们编写一个测试代码来验证我们的结论。
public static void main(string[]args)throws exception { dept dept=new dept(12,’市场部’);用户user=新用户(18,’ Java之旅’,dept);用户User 1=(User)User . clone();system . out . println(user==user 1);system . out . println();user 1 . setage(20);System.out.println(用户);system . out . println(user 1);system . out . println();dept . set name(‘ R & amp;d部门’);System.out.println(用户);system . out . println(user 1);}上面代码的运行结果如下
真实用户{age=18,name=’ Java ‘,dept=dept {deptno=12,name=’市场部’ }}用户{age=20,name=’ Java ‘,dept=dept {deptno=12,name=’市场部’ }}用户{age} Dept=Dept{deptNo=12,name=’ R & ampD Department’}} User {age=20,name=’ Java ‘,dept=dept {deptno=12,name=’ R & ampd部门’ }三。与轻拷贝相比,深拷贝将拷贝基本类型的属性。
深度复制功能的实现
复制用户时,同时复制用户中的dept属性。
部门类别:
@ Data @ AllArgsConstructor @ NoArgsConstructorpublic类Dept实现可克隆的{ private int deptNo私有字符串名称;@Override public Object clone()抛出CloneNotSupportedException { return super . clone();} }用户类别:
@ Data @ AllArgsConstructor @ NoArgsConstructorpublic类用户实现可克隆的{私人年龄私有字符串名称;私人部门;@覆盖保护对象克隆()抛出CloneNotSupportedException { User User=(User)super。clone();用户。Dept=(Dept)Dept . clone();返回用户;}}使用浅拷贝的测试代码继续测试,运行结果如下:
falseUser{age=18,name=’Java旅途,dept=Dept{deptNo=12,name=’市场部} }用户{age=20,name=’Java旅途,dept=Dept{deptNo=12,name=’市场部} }用户{age=18,name=’Java旅途,dept=Dept{deptNo=12,name=’研发部} }用户{age=20,name=’Java旅途,dept=Dept{deptNo=12,name=’市场部’}}除此之外,还可以利用反序列化实现深拷贝,先将对象序列化成字节流,然后再将字节流序列化成对象,这样就会产生一个新的对象。
作者:Java旅途原文链接:https://www。cnblogs。谢智/p/14323689。超文本标记语言

其他教程

求是期刊|摘编:数字防疫发挥重要作用

2022-8-17 12:27:30

其他教程

老年人手机教学步骤(老年人学智能手机教程)

2022-8-17 12:29:34

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索