最近用到了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浅拷贝和深拷贝分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/28114.html