list.addAll()是浅拷贝,如何实现list的深拷贝
Posted xjbclz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了list.addAll()是浅拷贝,如何实现list的深拷贝相关的知识,希望对你有一定的参考价值。
由于addAll()实现的是浅拷贝,即将 List A>- public
class A implements Cloneable -
public String name[]; -
-
public A() -
name=new String[2]; -
-
-
public Object clone() -
A o = null; -
try -
o = (A) super.clone(); -
catch (CloneNotSupportedExcepti on e) -
e.printStackTrace(); -
-
return o; -
-
在此,再多描述下关于clone的内容。 Java对对象和基本的数据类型的处理是不一样的。在Java中用对象的作为入口参数的传递则缺省为"引用传递",也就是说仅仅传递了对象的一个"引用",这个"引用"的概念同C语言中的指针引用是一样的。当函数体内部对输入变量改变时,实质上就是在对这个对象的直接操作。
一、当Class A成员变量类型是java的基本类型时(外加String类型),只要实现如上简单的clone(称影子clone)就可以。但是如果Class A成员变量是数组或复杂类型时,就必须实现深度clone。
- public
class A implements Cloneable -
public String name[]; -
-
public A() -
name=new String[2]; -
-
-
public Object clone() -
A o = null; -
try -
o = (A) super.clone(); -
catch (CloneNotSupportedExcepti on e) -
e.printStackTrace(); -
-
return o; -
-
- public
Object clone() -
A o = null; -
try -
o = (A) super.clone(); -
o.name=(String[])name.clone();//其实也很简单^_^ -
catch (CloneNotSupportedExcepti on e) -
e.printStackTrace(); -
-
return o; -
二、需要注意的是Class A存在更为复杂的成员变量时,如Vector等存储对象地址的容器时,就必须clone彻底。
- public
class A implements Cloneable -
public String name[]; -
public Vector B> claB; -
-
public A() -
name=new String[2]; -
claB=new Vector B>(); -
-
-
public Object clone() -
A o = null; -
try -
o = (A) super.clone(); -
o.name==(String[])name.clone();//深度clone -
o.claB=new Vector B>();//将clone进行到底 -
for(int i=0;i < claB.size() ; i ++ ) -
o.claB.add((B)claB.get(i).clone()); //当然Class B也要实现相应clone方法 -
-
catch (CloneNotSupportedExcepti on e) -
e.printStackTrace(); -
-
return o; -
转自:http://lovelace.iteye.com/blog/182772
以上是关于list.addAll()是浅拷贝,如何实现list的深拷贝的主要内容,如果未能解决你的问题,请参考以下文章
list.addAll(list1),如果list改变,怎么让list1的值不跟着改变!
#yyds干货盘点#Object.assign实现的是浅拷贝还是深拷贝?