专栏首页javathings深拷贝和浅拷贝的区别是什么,如何实现?

深拷贝和浅拷贝的区别是什么,如何实现?

深拷贝是彻底的拷贝,两对象中所有的成员都是独立的一份,而且,成员对象中的成员对象也是独立一份。

浅拷贝中的某些成员变量可能是共享的,深拷贝如果不够彻底,就是浅拷贝。


下图就是一个彻底的深拷贝,每一个成员都有一份对应的拷贝:

而下面这个图是浅拷贝,虽然有部分成员有对应的拷贝,但是,还是有部分成员变量是共享的,所以不是一个彻底的深拷贝。通常来说,值类型在浅拷贝的时候会复制一个独立的副本,而引用类型的数据,在浅拷贝是只是拷贝了一个引用。

Object 的 clone 方法是一个浅拷贝,如果它拷贝的对象中有其他对象,那么其中的对象是不会得到彻底的拷贝。

不要试图用 Cloneable 接口实现深拷贝。

Cloneable 接口只是一个标识接口,它未定义任何 clone 方法。通常使用它,还是需要覆盖 Object 的 Clone 方法(只有实现了 Cloneable 接口才可以调用 clone 方法),这种写法很容易导致未深拷贝不够彻底。《Effective Java》对此有更详细的说明。

笔者建议通过实现一个拷贝构造函数,或者使用第三方的方法,比如 apache-commons 的 SerializationUtils 方法来实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 转型架构师之路——郑天民

    架构师是一个综合性的角色,需要熟练掌握架构设计方法和开发技术,同时具备良好的组织管理能力。在第2篇《深入剖析架构师角色》中我们分析了架构师的主要职责和所开展的活...

    Java天坑
  • 深入理解Android:WebKit卷(移动开发)

    全书一共11章:第1章介绍了Android源代码阅读与编译环境的搭建;第2章介绍了浏览器的通用工作原理以及WebKit的架构设计;第3章深入解析了WTF的实现原...

    用户3157710
  • JavaScript权威指南(原书第6版)

    本书是程序员学习核心JavaScript语言和由Web浏览器定义的JavaScript API的指南和综合参考手册。

    用户3157710
  • Java性能权威指南

    本书对Java 7和Java 8中影响性能的因素展开了全面深入的介绍,讲解传统上影响应用性能的JVM特征,包括即时编译器、垃圾收集、语言特征等。内容包括:用G1...

    用户3157710
  • Java编程思想-第4版

    本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性...

    用户3157710
  • JavaScript设计模式与开发实践(图灵原创)

    本书是根据JavaScript语言的特性专门针对JavaScript语言全面总结的设计模式。全书共分为三个部分,一部分讲解了JavaScript语言面向对象和函...

    用户3157710
  • JavaScript语言精粹(修订版)

    JavaScript曾是“世界上最被误解的语言”,因为它担负太多的特性,包括糟糕的交互和失败的设计,但随着Ajax 的到来,JavaScript“从最受误解的编...

    用户3157710
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版) - 周志明

    《深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)》内容简介:第1版两年内印刷近10次,4家网上书店的评论近4?000条,98%以上的评论全部为5星级...

    用户3157710
  • Python源码剖析

    作为主流的动态语言,Python不仅简单易学、移植性好,而且拥有强大丰富的库的支持。此外,Python强大的可扩展性,让开发人员既可以非常容易地利用C/C++编...

    用户3157710
  • 超实用的JavaScript代码段 (代码逆袭)

    《超实用的JavaScript代码段》基于实用、实践、前瞻性、学习的原则,笔者精选了近300段JavaScript代码和400种解决方案,覆盖了几乎所有的脚本处...

    用户3157710

扫码关注云+社区

领取腾讯云代金券