深入理解Java浅拷贝与深拷贝
920
版权声明
我们非常重视原创文章,为尊重知识产权并避免潜在的版权问题,我们在此提供文章的摘要供您初步了解。如果您想要查阅更为详尽的内容,访问作者的公众号页面获取完整文章。
深入理解Java浅拷贝与深拷贝
概述
浅拷贝和深拷贝是Java中常见的对象复制方式,分别用于创建对象的简单副本和完整副本。本文通过代码示例和测试结果,详细解析两者的行为及区别。
浅拷贝
浅拷贝通过调用Object类的本地方法clone()实现。它创建一个新对象,并复制原对象的属性值。如果属性是基本数据类型,浅拷贝复制值;如果属性是引用数据类型,则复制内存地址。结果是两个对象共享同一引用数据。
示例代码中,测试了包含基本类型和引用类型(如Book对象)的Student类。结果显示,修改浅拷贝对象的引用类型字段会影响原对象,因为两者共享相同的内存地址。
注意:如果类未实现Cloneable接口,调用clone()会抛出CloneNotSupportedException异常。
深拷贝
深拷贝在复制对象时,会连同引用类型字段也克隆一份新对象。这样,修改其中一个对象的引用类型字段不会影响另一个对象。
通过重写引用类型字段的clone()方法,可以实现深拷贝。示例代码展示了Student类在调用clone()时同时克隆Book对象,以确保深拷贝的完整性。
此外,也可以通过序列化和反序列化实现深拷贝。该方法利用Serializable接口,将对象写入流并从流中读取,生成原对象的完全拷贝。虽然序列化方式性能较低,但适合嵌套对象较多且不便逐一重写clone()方法的场景。
总结
浅拷贝适用于简单对象复制,性能较高,但无法独立于原对象修改引用类型字段。深拷贝更适合复杂对象复制,能保证独立性,但需要重写引用类型字段的clone()方法或使用序列化,性能稍差。
根据实际需求选择合适的拷贝方式,权衡性能和实现复杂度。
特别说明
序列化方式实现深拷贝性能较低,但更灵活;虚拟机实现的clone()方法效率更高,但需实现Cloneable接口。
如本文对您有帮助,欢迎点赞、收藏、关注!感谢您的支持!
springboot葵花宝典
还在用多套工具管项目?
一个平台搞定产品、项目、质量与效能,告别整合之苦,实现全流程闭环。
白皮书上线