java 之 利用序列化实现深拷贝

我们知道 java 在 new 一个对象的时候,其代价是比 clone 一个对象的代价是要高的,但是拷贝也不能直接用,因 java 的拷贝分为深拷贝和浅拷贝, 虽然深拷贝可以解决浅拷贝的问题,但是也会在深拷贝的时候 new 对象。有一个比较好的额代替方法是:利用序列化实现对对象的拷贝。

在内存中通过字节流的拷贝是比较容易的实现的,把原对象写入到一个字节流中,再从字节流中将其读取出来,这样读取到的对象就是原对象的一个 clone 体,而且不存浅拷贝的问题,是一个真正的深拷贝。


public class CloneUtils {  

        @SuppressWarnings("unchecked")   
        public staticT clone(T obj){
        T cloneObj = null;
        try {
          //写入字节流
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            ObjectOutputStream obs = new ObjectOutputStream(out);
            obs.writeObject(obj);
            obs.close();

            //分配内存,写入原始对象,生成新对象
            ByteArrayInputStream ios = new ByteArrayInputStream(out.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(ios);

            //返回生成的新对象
            cloneObj = (T) ois.readObject();
            ois.close();

        } catch (Exception e) {
            e.printStackTrace();
        }
        return cloneObj;
    }

使用该工具类的对象必须要实现Serializable接口,否则是没有办法实现克隆的。

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

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 34,515评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 178,265评论 25 709
  • 不能继续喜欢你,想想就觉得很可惜
    月琳儿阅读 206评论 0 0
  • 原本的我可以为爱奋不顾身,五年后的我,变得唯唯诺诺,犹豫不决。 我高一时,爱慕过一个男...
    鹿鹿大小姐阅读 664评论 2 2
  • 昨天做了个好长好长的梦,关于纯儿,关于小雨。为了纯儿而欺骗小雨的梦,不想让纯儿吃一点醋的梦,还有人死,小雨被当做嫌...
    栖惶阅读 304评论 0 0

友情链接更多精彩内容