java对象拷贝主要有四种方法,Java 对象拷贝

  java对象拷贝主要有四种方法,Java 对象拷贝

  写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用

  为什么要使用克隆?(推荐学习:java常见面试题)

  想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。

  如何实现对象克隆?

  有两种方式:

  实现可克隆的接口并重写目标类中的克隆()方法;实现可序列化接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:

  导入Java。io。bytearray inputstream

  导入Java。io。bytearrayoutputstream

  导入Java。io。objectinputstream

  导入Java。io。对象输出流;

  导入Java。io。可序列化;

  公共类MyUtil {

  private MyUtil() {

  抛出新的断言错误();

  }

  @SuppressWarnings(未选中)

  公共静态T扩展可序列化T克隆(obj)引发异常{

  ByteArrayOutputStream bout=new ByteArrayOutputStream();

  对象输出流OOS=新对象输出流(bout);

  OOS。writeobject(obj);

  bytearray inputstream bin=new bytearray inputstream(bout。tobytearray());

  ObjectInputStream ois=新的ObjectInputStream(bin);

  返回ois。read object();

  //说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的关闭方法没有任何意义

  //这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放

  }

  }下面是测试代码:

  导入Java。io。可序列化;

  /**

  * 人类

  * @作者nnngu

  *

  */

  类人实现可序列化{

  private static final long serialVersionUID=-9102017020286042305 l;

  私有字符串名称;//姓名

  私人年龄;//年龄

  私家车汽车;//座驾

  公众人物(字符串名称,年龄,汽车汽车){

  this.name=name

  this.age=年龄;

  this.car=汽车;

  }

  公共字符串getName() {

  返回名称;

  }

  公共void集合名称(字符串名){

  this.name=name

  }

  public int getAge() {

  回归年龄;

  }

  公共无效存储(整数){

  this.age=年龄;

  }

  公共汽车getCar() {

  还车;

  }

  公共void setCar(汽车汽车){

  this.car=汽车;

  }

  @覆盖

  公共字符串toString() {

  return Person [name= name ,age= age ,car= car ];

  }

  }/**

  * 小汽车类

  * @作者nnngu

  *

  */

  类汽车实现可序列化{

  private static final long serial版本uid=-5713945027627603702 l;

  私人串串品牌;//品牌

  private int maxSpeed//最高时速

  公共汽车(字符串品牌,int maxSpeed) {

  this.brand=品牌;

  这个。最大速度=最大速度;

  }

  公共字符串getBrand() {

  回归品牌;

  }

  public void setBrand(字符串品牌){

  this.brand=品牌;

  }

  public int getMaxSpeed() {

  返回最大速度

  }

  public void setMaxSpeed(int maxSpeed){

  这个。最大速度=最大速度;

  }

  @覆盖

  公共字符串toString() {

  return Car [brand= brand ,maxSpeed= maxSpeed ];

  }

  }类克隆测试{

  公共静态void main(String[] args) {

  尝试{

  人员p1=新人员(郭靖,33,新车(奔驰,300));

  人员p2=我的util。克隆(P1);//深度克隆

  p2.getCar().设置品牌(比亚迪);

  //修改克隆的人对象p2关联的汽车对象的品牌属性

  //原来的人对象第一亲代关联的汽车不会受到任何影响

  //因为在克隆人对象时其关联的汽车对象也被克隆了

  系统。出去。println(P1);

  } catch(异常e) {

  e。printstacktrace();

  }

  }

  }注意:基于序列化和反序列化的克隆不仅是深度克隆,更重要的是可以通过泛型限定来检查要克隆的对象是否支持序列化。这种检查是由编译器完成的,而不是在运行时抛出异常。这种方案明显优于使用对象类的克隆方法克隆对象。让问题在编译时暴露出来总比让它在运行时暴露出来好。

  深拷贝和浅拷贝区别是什么?

  浅拷贝只拷贝一个对象的引用地址,两个对象指向同一个内存地址,所以你修改其中任何一个,另一个值都会改变。这是一个浅层拷贝(例如:assign())。深层副本复制对象及其值,如果两个对象修改其中任何一个,另一个值不会改变。这是一个深层副本(例如:JSON.parse()和JSON.stringify()

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

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