深拷贝和浅拷贝是两种常见的对象或数组复制方式。( 深拷贝和浅拷贝就是指对象的拷贝,一个对象中存在两种类型的属性,一种是基本数据类型,一种是实例对象的引用)

浅拷贝指的是新建一个对象,然后将原始对象中的非引用类型数据复制到新对象中,如果原始对象中有引用类型数据,则复制引用地址而不是实际数据。因此,在浅拷贝后新旧对象中的某些属性之间可能会出现相互影响的情况。(查看非引用数据类型和引用数据类型说明文章:引用数据类型和非引用数据类型_失败尽是常态Zzz的博客-CSDN博客)

例如:

class Person {int age;String name;Person(int age, String name) {this.age = age;this.name = name;}
}Person person1 = new Person(18, "Alice");
Person person2 = new Person(0, null);
person2.age = person1.age;  // 浅拷贝 age
person2.name = person1.name;  // 浅拷贝 nameSystem.out.println(person1.age);  // 18
System.out.println(person1.name); // "Alice"
System.out.println(person2.age);  // 18
System.out.println(person2.name); // "Alice"person1.age = 20;
person1.name = "Bob";
System.out.println(person1.age);  // 20
System.out.println(person1.name); // "Bob"
System.out.println(person2.age);  // 20
System.out.println(person2.name); // "Bob" 注意这里的影响!

在上面的例子中,我们把`person1`和`person2`都设置成`Person(18, "Alice")`,然后通过浅拷贝将`age`和`name`的值复制到了`person2`中。现在如果我们修改`person1`的`age`和`name`属性,同时输出`person2`的属性值,你会发现它们也随之被改变了。

与之相对的是深拷贝,它是将原始对象完全复制一份,并新建一个对象来存储这份复制品。深拷贝会递归地复制所有引用对象及其子对象,因此新旧对象各自修改互不影响。例如:

class Person implements Cloneable {int age;String name;Person(int age, String name) {this.age = age;this.name = name;}@Overridepublic Object clone() throws CloneNotSupportedException {return super.clone();}
}Person person1 = new Person(18, "Alice");
Person person2 = (Person) person1.clone();  // 深拷贝System.out.println(person1.age);  // 18
System.out.println(person1.name); // "Alice"
System.out.println(person2.age);  // 18
System.out.println(person2.name); // "Alice"person1.age = 20;
person1.name = "Bob";
System.out.println(person1.age);  // 20
System.out.println(person1.name); // "Bob"
System.out.println(person2.age);  // 18
System.out.println(person2.name); // "Alice" 注意这里没有影响!

在上面的例子中,我们通过在`Person`类中实现`Cloneable`接口并重写其`clone()`方法来实现深拷贝。然后,我们用深拷贝方式将`person1`复制到了`person2`中,并对它们的属性值进行了修改,结果发现新旧对象彼此互不影响。

需要注意的是,在使用Java自带的浅拷贝方法`clone()`时,其中包含的引用类型数据会被复制其引用地址而非数据本身,因此需要特别注意在使用`clone()`方法进行拷贝时处理好有引用类型的数据。如果需要深度拷贝,请使用其他方式完成或自定义`clone()`方法来实现深拷贝。

八股文之深拷贝和浅拷贝相关推荐

  1. Python 精选笔试面试习题—类继承、方法对象、包管理、闭包、可变类型作为默认参数、列表引用、sort与sorted、 append 和 extend、深拷贝和浅拷贝

    1. 类继承 如下代码 class A(object):def show(self):print 'This is calss A'class B(A):def show(self):print 'T ...

  2. C++深拷贝与浅拷贝

    浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值.但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件..当 值拷贝的时候,两个对象就有用共同的资源,同时对资源可以 ...

  3. python的深拷贝与浅拷贝

    对于list, set, dict来说, 直接赋值. 其实是把内存地址交给变量. 并不是复制⼀份内容. 两个变量的内容其实为一个地址,如果要在复制的同时分配新的地址则需要用到深拷贝和浅拷贝的命令 ls ...

  4. 详谈Javascript中的深拷贝和浅拷贝

    数据复制是我们编程中经常会使用到的技术,对于普通数值数据来说,复制很简单,但是对于复杂类型比如对象的复制,就会有很多需要考虑的东西,比如我们经常说到的深拷贝和浅拷贝. 浅拷贝 复制的对象和原始对象属性 ...

  5. python怎么避免浅拷贝_详谈Python中的深拷贝和浅拷贝

    在平时工作中,经常涉及到数据的传递,在数据传递使用过程中,可能会发生数据被修改的问题.为了防止数据被修改,就需要在传递一个副本,即使副本被修改,也不会影响原数据的使用.为了生成这个副本,就产生了拷贝. ...

  6. c++深拷贝和浅拷贝

    C++中类的拷贝有两种:深拷贝,浅拷贝:当出现类的等号赋值时,即会调用拷贝函数 一:两个的区别 1 在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数--即浅拷贝,它能够完成成员的一一复制.当 ...

  7. 更清晰的认识对象——深拷贝与浅拷贝

    对象在引用的时候引用的是对象的地址,所以导致如果修改其中一个对象,就会对其他引用这个地址的对象进行修改,这种结果并不是我们想要的,这个时候我们就要用到深拷贝和浅拷贝去解决这个问题了. var a = ...

  8. 深拷贝与浅拷贝~动态内存释放有关

    浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如: class A{ public: A(int ...

  9. 深入浅出的“深拷贝与浅拷贝”

    js中的浅拷贝与深拷贝,只是针对复杂数据类型(object, Array)的复制问题.浅拷贝和深拷贝都可以实现在已有对象上再生出一份的作用.但是对象的实例是存储在堆内存中然后通过一个引用值只操作对象, ...

最新文章

  1. 一本算法刷题必读配套书(附链接)
  2. 计算机领域认知个人陈述,计算机专业个人陈述十九
  3. ubuntu mysql安装_在 Ubuntu 18.0-10上安装 MySQL8
  4. 《剑指offer》链表中倒数第k个结点
  5. Jeecg-Boot2.1.2 版本,手工集成Online在线开发模块(Online表单、Online报表)
  6. base64 编码 在websocket协议中的应用
  7. VCAP5-DCA – What’s new?
  8. 从零实现深度学习框架——常见运算的计算图
  9. HttpClient(一)HttpClient抓取网页基本信息
  10. python学习笔记(xlsxwriter模块使用)
  11. win10打开计算机黑屏怎么办,win10系统开机就一直黑屏无法进入桌面的解决方法...
  12. uos系统桌面怎么没有计算机图标,UOS系统体验:启动、桌面和开始菜单
  13. SurfaceLaptop2_BMR_46_13.1.7_2.zip恢复镜像网盘满速下载地址
  14. 主题:“芙蓉姐姐”荣登05年十大令人作呕女人榜首…… [荐]
  15. 常微分方程 $5 微分方程稳定性
  16. mac系统安装手机安装包
  17. 利用JS-XLSX插件 用JS读取excel数据
  18. linux中设置透明代理
  19. c语言中错误c2061,error C2061: 语法错误: 标识符“_Wherenode”
  20. 华恩JAVA班第52天

热门文章

  1. CSP-J/S第一轮测试知识点全覆盖
  2. WCF服务引用的两种方法
  3. 无人机直播推流持续发力,联合EasyDSS为仓储物流业保驾护航
  4. echarts实现单个城市下所有区域地图
  5. java metrics 简书_Dropwizard Metrics使用
  6. GWAS数据下载详解(1)
  7. 真实的上流社会什么样?
  8. sudo命令免密码 sudo免密码
  9. FPGA入门指导手册-----------它是空的(不信你点开看看啊)
  10. 8.C语言之编译错误大全及中文解释