java深克隆的实现,java深浅克隆的原理区别

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: