Java 对象深度clone的两种方式

Java 对象深度clone的两种方式

实现Cloneable接口

  1. 该类及其所有需要复制的引用类型的成员变量 实现Cloneable接口
  2. 该类及其所有需要复制的引用类型的成员变量 重写 clone()方法

实例

特点

  1. 实现麻烦, 特别是当引用类型的成员变量较多时
  2. 性能好

序列化实现

  1. 该类及所有需要复制的引用类型成员变量实现Serializable接口
  2. 将对象序列化后再反序列化出新的对象

实例

public User deepClone() {
        ByteArrayOutputStream bo = new ByteArrayOutputStream();
        ObjectOutputStream oo = null;
        ByteArrayInputStream bi;
        ObjectInputStream oi = null;
        try {
            oo = new ObjectOutputStream(bo);
            oo.writeObject(this);
            bi = new ByteArrayInputStream(bo.toByteArray());
            oi = new ObjectInputStream(bi);
            return (User) oi.readObject();

        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

特点

  1. 实现相对简单
  2. 性能较差

性能对比

创建User 类 ,增加一个HashMap 成员变量,分别通过以上两种方式进行对象复制。

  • 结果
方式 执行次数 耗时(ms)
通过重写Clone方法 10000 3
序列化 10000 714

总结

通过性能对比,可以看出,两种方式,性能相差悬殊,且随着需要复制对成员变量增多,性能差距会更加明显。
所以若对性能要求较低,为方便可以通过序列化方式实现,并且不建议直接在主线程操作,否则,为保证性能,仍需通过实现Cloneable接口方式来完成。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容