浅克隆 深克隆

关于对象克隆(复制)的总结如下:

  1. 克隆的分类:
  • 浅克隆:复制对象本身,但对象中的引用类型字段仍指向原对象的引用。

  • 深克隆:完全复制对象及对象中所有引用类型字段指向的 对象, 形成独立的新对象。

  1. 深克隆的主要方式:
  • 重写Object类的clone()方法,通过层层克隆引用类型字段实现深克隆。

  • 序列化和反序列化:将对象写入文件(或其他流)后再读取恢复,可生成多个独立对象,属于深克隆。

  • 使用ByteArrayInputStream和ByteArrayOutputStream:通过字节数组流完成对象的深克隆。 将要克隆的Java对象写到内存中的字节数组中,再从内存中的字节数组中读取对象,读取到的对象就是一个深克隆对象。

具体流程是:

  1. 用 ByteArrayOutputStream 创建内存字节数组输出流,再通过 ObjectOutputStream 将对象序列化到该字节数组中(完成对象的写入);

  1. 用 ByteArrayInputStream 读取上述字节数组,再通过 ObjectInputStream 反序列化出对象(完成对象的读取)。

通过这种"字节数组流+对象流"的组合,借助序列化和反序列化机制,最终得到的对象就是原对象的深克隆版本。

问题:

问题规范:为什么实现对象深克隆时,需要结合ByteArrayOutputStream和ByteArrayInputStream,而不能直接仅用ObjectOutputStream?ByteArrayOutputStream的意义是什么?

回答:

使用ObjectOutputStream进行序列化时,需要指定输出目的地(如文件、网络流等)。而ByteArrayOutputStream的核心意义是提供内存中的字节数组作为序列化的临时存储容器,避免将数据写入磁盘文件等外部存储,直接在内存中完成"写入-读取"的闭环:

  1. 通过ByteArrayOutputStream在内存中创建字节数组,配合ObjectOutputStream将对象序列化到该内存数组中(无需操作外部文件);

  2. 再通过ByteArrayInputStream读取该内存字节数组,配合ObjectInputStream反序列化出克隆对象。

这种方式的优势在于:全程基于内存操作,无需IO磁盘交互,效率更高,且仅用于对象克隆场景时,无需额外处理文件创建、删除等操作,更简洁。

如果仅用ObjectOutputStream而不结合ByteArrayOutputStream,通常需要将对象序列化到文件等外部存储,会增加IO开销,且不符合"内存中快速克隆"的场景需求。因此,ByteArrayOutputStream的作用是提供高效的内存级临时存储,让序列化-反序列化过程更适合深克隆的轻量、快速需求。

相关推荐
xcl092512 分钟前
智慧场馆解决方案系统源码:从架构设计到部署实战
java·spring boot
liangbo724 分钟前
06-JVM垃圾回收器之CMS
java·jvm
黑马程序员毕设26 分钟前
基于Java的仪器管理系统设计与实现
java·开发语言·spring boot·后端·微信小程序
骇客野人39 分钟前
SpringBoot电商购物车、结算、下单、库存方案设计与落地实施步骤
java·spring boot·后端
哪 吒1 小时前
华为OD机试 - 云服务安全策略最优选择 - 深度优先搜索DFS(Java 新系统 200分)
java·华为od·深度优先
拒绝内耗。1 小时前
程序员学架构(一):一张图看懂 Java 后端架构:一个请求怎样从手机到数据库?
java·智能手机·架构
棣廷1 小时前
初识Python面向对象
java·开发语言
用户3126874877201 小时前
ThreadLocal 到底会不会内存泄漏?源码级拆解 + 线程池陷阱
java
珍珠先生1 小时前
P11 · MySQL 驱动版本过旧:Client does not support authentication protocol
java
~木雨1 小时前
Java 并发编程架构全景:并发层的五域设计 —— 线程模型、线程池隔离、并发安全到问题治理(全体系汇总)
java·安全·架构·线程池·并发编程·高并发架构