java 深拷贝 序列化_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接口,否则是没有办法实现克隆的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值