美文网首页
Java中的Clone

Java中的Clone

作者: 一只弹窗仔 | 来源:发表于2019-12-16 22:29 被阅读0次

    参考:https://juejin.im/entry/5bafa3d66fb9a05cff322691
    总结:
    1、如果想要支持clone,就需要实现Cloneable 接口
    2、如果没有实现Cloneable接口的调用clone方法,会抛出CloneNotSupportedException异常。
    3、重写clone方法,并修改成public访问级别
    深拷贝:
    1、使用默认的clone方法
    2、对于原始数据域进行值拷贝
    3、对于引用类型仅拷贝引用
    4、执行快,效率高
    5、不能做到数据的100%分离。
    6、如果一个对象只包含原始数据域或者不可变对象域,推荐使用浅拷贝。
    浅拷贝:
    1、需要重写clone方法,不仅仅只调用父类的方法,还需调用属性的clone方法
    2、做到了原对象与克隆对象之间100%数据分离
    3、如果是对象存在引用类型的属性,建议使用深拷贝
    4、深拷贝比浅拷贝要更加耗时,效率更低
    深拷贝实现方式:

     //深度拷贝
        public Object deepClone() throws Exception{
            // 序列化
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            // 反序列化
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return ois.readObject();
        }
    

    序列化是将对象写到流中便于传输,而反序列化则是把对象从流中读取出来。这里写到流中的对象则是原始对象的一个拷贝,因为原始对象还存在 JVM 中,所以我们可以利用对象的序列化产生克隆对象,然后通过反序列化获取这个对象。
    注意每个需要序列化的类都要实现 Serializable 接口,如果有某个属性不需要序列化,可以将其声明为 transient,即将其排除在克隆属性之外。
    因为序列化产生的是两个完全独立的对象,所有无论嵌套多少个引用类型,序列化都是能实现深拷贝的。

    相关文章

      网友评论

          本文标题:Java中的Clone

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