java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别最近用到了clone方法,并且遭遇到各种奇怪的bug;一,浅拷贝浅拷贝:对基本类型的数据是值拷贝,对String类型的拷贝也可以看作是值拷贝,这里不做讨论;浅拷贝是什么呢,先上一段代码,对着看代码很容易理解: Vector<Vector>data=newVector<Vector>(); for(inti=0;i<4;i++){ …

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

最近用到了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方法干了什么呢?

java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

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

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

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

why?

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

以增加为例:

java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

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

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

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

二,深拷贝

什么是深拷贝?

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

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

来个不太恰当的比喻:

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

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

如何深拷贝?

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

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

java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

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

每一个java浅拷贝和深拷贝的区别_js中深拷贝和浅拷贝的区别

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/187208.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • roboguide安装失败异常代码_ros安装教程unbuntu18.04

    roboguide安装失败异常代码_ros安装教程unbuntu18.04安装ROS时,报错:GPGerror:******isnotavailable:NO_PUBKEY******问题分析图片里的第三行提示信息:W:GPGerror:http://packages.ros.org/ros/ubuntuxenialInRelease:Thefollowingsignaturescouldn’tbeverifiedbeca…

    2022年10月10日
    5
  • 循环队列–C语言实现–数据结构「建议收藏」

    循环队列–C语言实现–数据结构「建议收藏」循环队列–C语言实现–数据结构目录循环队列C语言实现数据结构目录一要求二循环队列三循环队列的算法设计1建立循环队列2置空队列3入队4出队5打印队四程序1程序的结构2程序源码五程序测试1入队列2出队列3打印队列六源程序及封装软件下载下载地址格格是一枚智能专业的本科在校生很愿意和各位大佬交流如果大家有愿意交朋友的可以加格格的QQ4460

    2022年6月2日
    38
  • scrapy 安装步骤[通俗易懂]

    scrapy 安装步骤[通俗易懂]pipinstallpywin32pipinstalllxmlpipinstallwheelpipinstalltwisted安装包下载地址:http://www.lfd.uci.edu/~gohlke/pythonlibs/pipinstallscrapy

    2022年9月18日
    2
  • anaconda安装opencv(whl文件)

    anaconda安装opencv(whl文件)我用pipinstall和condainstall的方法都安装不上去,都失败了,找了很多原因都没办法解决。没办法,只能尝试一下用第三方包whl文件安装下,因为原来没有用过这个方法,也不知道难不难,小心的去试了一下,没想到非常的容易!而且清华大学opencvpython库里的whl文件下载速度非常快(几十秒),比我之前在别的地方找的whl文件快多了。没安装上opencv或其他库的小伙伴,…

    2022年5月22日
    121
  • [HTML] 那个圣诞树,把代码分享给大家

    [HTML] 那个圣诞树,把代码分享给大家<!DOCTYPEHEMLPUBLIC><html><head><metacharset=”utf-8″><style>html,body{width:100%;height:100%;margin:0;padding:0;border:0;}div{margin:0;padding:0;border:0;}.nav{position:absolute;top:.

    2022年7月12日
    16
  • FileSystemWatcher触发多次Change事件的解决办法

    FileSystemWatcher触发多次Change事件的解决办法FileSystemWatcher监视文件夹中数据变化时,会多次出发Change事件。EnableRaisingEvents=true,启动文件监控,网上查到的做法是通过一个定时器来避免多次触发。其实可以通过,在第一次触发后EnableRaisingEvents=false先关闭在打开EnableRaisingEvents=true,简单解决这个问题。

    2022年6月18日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号