Java的克隆clone

作者: York_Hwang | 来源:发表于2019-11-17 23:37 被阅读0次

一、为什么需要克隆

提升性能。

Java开发者在开发中经常遇到需要拷贝一个对象的情况,很多同学习惯用BeanUtils(Srping、Apache Common都有提供)来拷贝对象的属性到另外一个对象,但是在实际中,拷贝的效率并不高。其实,Java对象本身提供底层原生的clone方法,可提升拷贝的性能。

二、怎样实现克隆

浅克隆(ShallowClone)和深克隆(DeepClone)。

浅克隆:

  1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)。

  2. 覆盖clone()方法,访问修饰符设为public。方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)

深克隆:

实现深克隆,可以通过覆盖Object类的clone()方法实现,也可以通过序列化(Serialization)等方式来实现

序列化方法实现深克隆:

public class Outer implements Serializable{
  private static final long serialVersionUID = 369285298572941L;  //最好是显式声明ID
  public Inner inner;
 //Discription:[深度复制方法,需要对象及对象所有的对象属性都实现序列化]
  public Outer myclone() {
      Outer outer = null;
      try { 
// 将该对象序列化成流,因为写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。所以利用这个特性可以实现对象的深拷贝
          ByteArrayOutputStream baos = new ByteArrayOutputStream();
          ObjectOutputStream oos = new ObjectOutputStream(baos);
          oos.writeObject(this);
   // 将流序列化成对象
          ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
          ObjectInputStream ois = new ObjectInputStream(bais);
          outer = (Outer) ois.readObject();
      } catch (IOException e) {
          e.printStackTrace();
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      }
      return outer;
  }
}

Inner也必须实现Serializable,否则无法序列化:

public class Inner implements Serializable{
  private static final long serialVersionUID = 872390113109L; //最好是显式声明ID
  public String name = "";
  public Inner(String name) {
      this.name = name;
  }

  @Override
  public String toString() {
      return "Inner的name值为:" + name;
  }
}

相关文章

  • Java的克隆clone

    一、为什么需要克隆 提升性能。 Java开发者在开发中经常遇到需要拷贝一个对象的情况,很多同学习惯用BeanUti...

  • Java深度拷贝方式和性能对比

    前言 Java的深度拷贝大致分为克隆(实现Java的Clone接口)和序列化(实现Java的Serializabl...

  • Java对象克隆

    引自:Java对象克隆(Clone)及Cloneable接口、Serializable接口的深入探讨https:/...

  • java基础之克隆

    Java提高篇——对象克隆(复制) 浅克隆 被复制的类需要实现Clonenable接口(不实现的话在调用clone...

  • 设计模式 | 原型模式及典型应用

    前言 本文的主要内容如下: 介绍原型模式 示例Java语言的clone浅克隆与深克隆实现深克隆 原型模式的典型应用...

  • super.clone()做了什么

    java对象如果想被克隆,它对应的类需要implements标志接口Cloneable。如果不重写clone()方...

  • java基础-Object

    Object是java中的顶级父类---也是java中唯一一个没有父类的类. 重要方法 clone()---克隆出...

  • git教程 第二节 git clone 与git branch与

    一、克隆项目 git clone(默认master分支) git clone默认是克隆master分支上的代码我们...

  • 远程仓库管理

    克隆版本库 克隆版本库的作用 克隆版本库git clone [url]▼ clone下来的repo会以url最后一...

  • Git 一些常用指令

    创建版本库 git clone //克隆远程版本库 git clone -b //克隆远程指定分支 g...

网友评论

    本文标题:Java的克隆clone

    本文链接:https://www.haomeiwen.com/subject/ybnmictx.html