java深克隆的实现,java深浅克隆的原理区别
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
阿里面试官问题:
谈谈你对爪哇岛中的深克隆和浅克隆的理解
回答:
(说明:本文针对深克隆和浅克隆的区别和实现方式?这一问题)
空谈不值钱#
最近不止一次遇见深浅克隆(深复制,浅复制)的问题,除了印象中有个克隆方法外一脸懵逼!克隆(复制)在爪哇中是一种常见的操作,目的是快速获取一个对象副本。克隆分为深克隆和浅克隆。
浅克隆:创建一个新对象,新对象的属性和原来对象完全相同,对于非基本类型属性,仍指向原有属性所指向的对象的内存地址。
深克隆:创建一个新对象,属性中引用的其他对象也会被克隆,不再指向原有对象地址。
总之深浅克隆都会在堆中新分配一块区域,区别在于对象属性引用的对象是否需要进行克隆(递归性的)。
给你看我的照片#
位置:当前对象的地址;
儿子:儿子属性所指向的地址;
名称:对象的名字属性。
(相关推荐:java入门教程)
给你看我的代码#
案例1:
公共类儿子实现可序列化、可克隆的{私有字符串名称;私子子;public Son(){ super();
} public String getName(){ return name;
} public void set name(String name){ this。name=名称;
} public Son getSon(){ return Son;
} public void setSon(Son Son){ this。儿子=儿子;
} @覆盖
公共字符串toString(){ return super。toString();
} @覆盖
保护对象克隆()抛出CloneNotSupportedException { return super。clone();
}
}测试
公共静态void main(String[] args)引发异常{//创建父亲(刘璃),儿子(吴礼),孙子(刘璃)并关联
儿子父亲=新儿子();
父亲。集合名称(“LiSi”);
Son Son=new Son();
son.setName(吴礼);
儿子孙子=新儿子();
孙子。设置名称(刘璃);
父亲.塞特森(儿子);
son.setSon(孙子);//调用克隆方法
儿子父亲。clone();布尔标志1=父副本==父;布尔标志2=父副本。getson()==son;boolean flag3=fatherCopy.getSon().getSon()==孙子;//比较克隆后的地址
系统。出去。println(标志1);//假
系统。出去。println(标志2);//真
系统。出去。println(标志3);//真
//比较名字
标志1=父副本。getname()==父亲。getname();
flag2=fatherCopy.getSon().getName()==son。getName();
flag3=fatherCopy.getSon().getSon().getName()==孙子。getName();
系统。出去。println(标志1);//真
系统。出去。println(标志2);//真
系统。出去。println(标志3);//真
//将对象写到流里
ByteArrayOutputStream byte out=new ByteArrayOutputStream();
对象输出流objOut=新对象输出流(字节输出);
objOut.writeObject(父亲);//从流里读出来
bytearray inputstream byteIn=new bytearray inputstream(byte out。tobytearray());
ObjectInputStream objInput=new ObjectInputStream(byteIn);
父副本=(子)对象输入。read object();
flag1=父副本==父
标志2=父副本。getson()==son;
flag3=fatherCopy.getSon().getSon()==孙子;
系统。出去。println(标志1);//假
系统。出去。println(标志2);//假
系统。出去。println(标志3);//假
//比较名字
标志1=父副本。getname()==父亲。getname();
flag2=fatherCopy.getSon().getName()==son。getName();
flag3=fatherCopy.getSon().getSon().getName()==孙子。getName();
系统。出去。println(标志1);//假
系统。出去。println(标志2);//假
系统。出去。println(标志3);//false}从上文代码及运行结果不难看出,如果对象实现可克隆的并重写克隆方法不进行任何操作时,调用克隆是进行的浅克隆。而使用对象流将对象写入流然后再读出是进行的深克隆。
思考:既然实现可克隆接口和重写克隆接口只能进行浅层克隆。但是,如果对一个类的引用类型属性(以及一个属性的引用类型属性)进行浅层克隆,直到没有引用类型属性或者引用类型属性为空,就会整体形成深层克隆。对象的引用类型属性和属性的应用程序类型属性都实现Coloneable,重写clone方法并在clone方法中调用它。
受保护对象clone()引发CloneNotSupportedException {
Son result=(Son)super . clone();如果(儿子!=null) {
result . Son=(Son)Son . clone();
}返回结果;
}个人认为,在选择深度克隆方式时,要根据对象的复杂程度,比如引用类型属性是否有多个引用类型属性关系。如果对象只有一两层引用类型的属性,选择思路中提到的方法更方便;否则,使用对象流。
更多面试问题请访问:java面试问答。以上是你对java中深度克隆和浅层克隆的理解细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。