为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Java中对象进行深度复制?

如何在Java中对象进行深度复制?

郎朗坤 2019-06-12 15:09:44
如何在Java中对象进行深度复制?在java中,实现深度对象复制函数有点困难。您采取了哪些步骤来确保原始对象和克隆对象不共享引用?
查看完整描述

3 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

一种安全的方法是序列化对象,然后反序列化。这确保了一切都是全新的参考。

这是一篇文章关于如何有效地做到这一点。

注意:类有可能覆盖序列化,例如新实例为单身汉而创建的。当然,如果您的类不是可序列化的,这也是不起作用的。


查看完整回答
反对 回复 2019-06-12
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

有几个人提到使用或重写Object.clone()..别这么做。Object.clone()存在一些主要问题,而且在大多数情况下都不鼓励使用它。请参阅项目11,从“有效Java“约书亚·布洛赫给你一个完整的答案,我相信你可以安全地使用Object.clone()在基本类型数组上,但是除此之外,您还需要正确地使用和重写克隆。

依赖序列化(XML或其他方式)的方案是不切实际的。

这里没有简单的答案。如果要深入复制对象,则必须遍历对象图,并通过对象的复制构造函数或静态工厂方法显式地复制每个子对象。不变(例如)String不需要复制。顺便说一句,出于这个原因,你应该赞成不变性。


查看完整回答
反对 回复 2019-06-12
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以使用序列化进行深度复制,而无需创建文件。

您希望深入复制的对象将需要implement serializable..如果类不是最终类或无法修改,则扩展类并实现可序列化。

将类转换为字节流:

ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(object);
oos.flush();oos.close();bos.close();byte[] byteData = bos.toByteArray();

从字节流还原类:

ByteArrayInputStream bais = new ByteArrayInputStream(byteData);(Object) object = (Object) new ObjectInputStream(bais).readObject();


查看完整回答
反对 回复 2019-06-12
  • 3 回答
  • 0 关注
  • 1281 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号