实现list的深拷贝
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现list的深拷贝相关的知识,希望对你有一定的参考价值。
参考技术A 这时,获取source.get(0)的name值,也变成了“CDE”。为了解决这个问题,使得改变copy中的值,不影响source中的数据,则要进行深拷贝。
即,对A类实现clone()方法:
然后,
就可以进行深拷贝了。
在此,再多描述一下关于Clone的内容。
Java对对象和基本数据类型的处理是不一样的。在Java中用对象作为入口参数的传递则缺省为“引用传递”,也就是说仅仅传递了对象的一个“引用”,这个引用的概念与C语言中的指针引用是一样的。当函数体内部对这个变量进行改变时,实质上就是对这个对象进行直接操作。
除此之外,在任何用“=”向对象变量赋值的时候都是“引用传递”。
一、当Class A的成员变量类型是基本数据类型(外加String类型)时,只要实现如上简单的clone(称影子clone)就可以。但是如果Class A的成员变量是数组或者更复杂类型时,就必须实现深度clone。
此处的A的成员变量String[],影子clone对name数组clone他们的地址,需进行深拷贝。
二、需要注意的是,Class A存在更为复杂的成员变量时,如Vector等存储对象地址的容器时,就必须clone彻底。
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的深拷贝的主要内容,如果未能解决你的问题,请参考以下文章
python list的深拷贝与浅拷贝-以及初始化空白list的方法
python list的深拷贝与浅拷贝-以及初始化空白list的方法