最近用到了clone方法,并且遭遇到各种奇怪的bug;

一,浅拷贝

浅拷贝:对基本类型的数据是值拷贝,对String类型的拷贝也可以看作是值拷贝,这里不做讨论;

浅拷贝是什么呢,先上一段代码,对着看代码很容易理解:

     Vector<Vector> data = new Vector<Vector>();for(int i = 0;i<4;i++) {Vector v = new Vector();v.add(i+1);v.add(i*5);data.add(v);}Vector<Vector> copyData = (Vector<Vector>) data.clone();

这段代码很简单:

先初始化Vector数组(data),data共有4个Vector数组元素;

data.clone()就是将data浅拷贝到copyData中;

copyData == data 结果为false;

在这个例子中clone方法干了什么呢?

clone方法就是在内存中另建了一个Vector数组对象,但是copyData数组中的4个元素只是复制了data数组中4个元素的引用;

因此:只有当通过copyData操纵从data中复制过来的四个元素,会对原data的数据造成影响;

但是你在copyData中再增添一个元素或者删除元素,是不会对原data数组有影响的;

why?

当增加一个元素时,相当于是在copyData数组中增加或删除一个引用;

以增加为例:

同理,删除从原数组中copy过来的元素时,也只是将引用删除掉了而已,而原数组仍然保持对该数组元素的引用,因此删除不会对原数组有任何影响;

相对的在data中删除或增加元素也不会对copyData有影响;

综上:只有修改2个数组中共同引用的数据才会对clone的两个数据造成影响;而增加或删除都不会对彼此有影响;

二,深拷贝

什么是深拷贝?

通过上面对浅拷贝的解释可以看出,拷贝对象在修改数据时会对原数据有影响;也就是说,其实clone的2个对象还有关联;

而深拷贝就是将2个对象彻底分离,当修改clone对象的数据时不会影响到原数据,而元数据修改也不会影响到clone对象;

来个不太恰当的比喻:

clone(浅拷贝)相当于时连体婴儿;一方的行动会影响到另一方;

而深拷贝:就像是2个独立的双胞胎个体(虽然长得一样,但是却是2个互不影响的独立运动的个体);

如何深拷贝?

深拷贝就相当于是要斩断两者之间的联系;

还是以data和copyData为例,要做到深拷贝,就如下图:

在这个例子中深拷贝其实就是对四个元素再分别拷贝就行

每一个

假如在这个例子中每一个Vector元素中存入的数据不是整型变量;是一个Student对象(有各种属性),要深拷贝的话还得把student对象也进行拷贝一次;

如果引用链很长的话,用这种方式进行深拷贝就会变得困难,Java还有另一种方式可以深拷贝实现Serializable接口;具体可以参考序列化实现深拷贝

Java浅拷贝和深拷贝相关推荐

  1. java什么地方要用深拷贝,关于 Java 浅拷贝、深拷贝,你真的知道了吗?

    这是今天我们在技术群里面讨论的一个知识点,讨论的相当激烈,由于对这一块使用的比较少,所以对这一块多少有些盲区.这篇文章总结了所讨论的内容,希望这篇文章对你有所帮助. 在 Java 开发中,对象拷贝或者 ...

  2. Java 浅拷贝、深拷贝,你知多少?

    在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存 ...

  3. Java提高篇 —— Java浅拷贝和深拷贝

    一.前言 我们知道在Java中存在这个接口Cloneable,实现该接口的类都会具备被拷贝的能力,同时拷贝是在内存中进行,在性能方面比我们直接通过new生成对象来的快,特别是在大对象的生成上,使得性能 ...

  4. Java浅拷贝和深拷贝(一文足矣),及String类型的坑。

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/q258523454/article/d ...

  5. Java浅拷贝和深拷贝的方式

    文章目录 1. 前言 2. 概念介绍 2.1 拷贝 / 克隆的概念 2.2 为什么需要拷贝方法? 2.3 什么是浅拷贝?浅拷贝和深拷贝的区别是什么? 3. 深拷贝的实现方式 3.1 手动深拷贝 3.2 ...

  6. java 浅拷贝和深拷贝

    实现拷贝有几点: 1)实现Cloneable接口 2)重写Object类中的clone方法,并将可见性从protect改为public 3)克隆需要调用super.clone(),也就是Object的 ...

  7. java浅拷贝和深拷贝的区别_Java 浅拷贝与深拷贝的区别

    浅拷贝 什么是浅拷贝 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.即对象的浅拷贝会对"主"对象进行拷贝,但不会复制主对象里面的对象. ...

  8. Java 浅拷贝和深拷贝的理解和实现方式

    https://www.cnblogs.com/shakinghead/p/7651502.html https://blog.csdn.net/huwentao_totti/article/deta ...

  9. 谈一谈Java中的深拷贝和浅拷贝

    在 Java 开发中,对象拷贝或者说对象克隆是常有的事,对象克隆最终都离不开直接赋值.浅拷贝.深拷贝 这三种方式,其中直接赋值应该是我们最常用的一种方式吧,对于浅拷贝和深拷贝可能用的少,所以或多或少存 ...

  10. java 如何实现深拷贝

    1.什么叫Java浅拷贝?  浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝.如果属性是基本类型,拷贝的就是基本类型的值:如果属性是内存地址(引用类型),拷贝的就是 ...

最新文章

  1. CXF WebService整合Spring
  2. transfer = C only read dynamically - why it fails to work
  3. ActionBar之style出现Cannot resolve symbol 'Theme' 错误
  4. 预警系统一键自动升级_东风风行新风行T5购车手册,首推1.5T自动尊贵型
  5. Linux进度条的实现
  6. 找不到元数据文件“ .dll”
  7. 第三季-第9课-库函数方式文件编程
  8. style样式:json对象和字符串相互转化
  9. 秦添智能染布厂ERP、染厂ERP系统、印染ERP生产管理系统
  10. java分布式事务框架_Java分布式事务,及解决方案
  11. CDN加速是什么?具体有什么用?
  12. matlab符号计算证明sin,matlab的符号计算
  13. easyexcel实现导出
  14. 【NOIP普及组】 1945:【09NOIP普及组】多项式输出
  15. 洛阳等地启动电子劳动合同试点,多家名企选择法大大
  16. 二维码的20种商业应用模式
  17. 苹果xr十大隐藏功能_别再说苹果“悬浮球”功能不好用,隐藏的实用小技巧,每天用得上...
  18. 国科大 - 自然语言处理(刘洋)- 期末复习
  19. MOOC(幕课)的到来!
  20. java continu语句

热门文章

  1. 数值分析常见算法C++实现
  2. 计算机水冷散热器原理,水冷散热器原理和作用是什么
  3. DIS全球首款基于数字资产证券化交易生态系统
  4. main方法是java app_Appmain1.java
  5. 条形码的含义以及商品条码的申请流程
  6. 约束布局错误提示(ConstraintLayout)This view is not constrained horizontally: at runtime it will jump to the
  7. JavaScript lambda 表达式介绍
  8. java开发app教程,就是这么简单
  9. Python Flask学习_使用flask-login实现认证蓝本(一)
  10. 电驴链接服务器老是无响应,全部服务器无响应!!!