原帖地址http://igaominghai.blog.163.com/blog/static/84014481200942321119235/
今天写一个用二维数组存储图结构的程序,涉及到两个二组之间的深拷贝:
char[][] QPN = new char[30][30];
char[][] UQPN = new char[30][30];
System.arraycopy(this.QPN, 0, UQPN, 0, this.QPNNumber);//this.QPNNumber为图的节点个数,这里假设QPN已被赋值
当对UQPN进行操作并改变其元素的值之后,发现QPN的值也被改变,但以前也用过这个方法对数组进行深拷贝,而且成功,困惑... 上网查了一下:
JAVA中没有多维数组的概念,只有数组的数组,因此QPN是一个数组的数组,同理UQPN 也是。那么QPN 含有两个元素,分别指向两个数组的引用,而arrayCopy 就是负责把数组的内容copy 过去的,因此QPN的内容 (2 个引用) 被copy 到UQPN 中去了,因此对QPN做修改,QPN也会同样跟着变化.
在JAVA里面,可以用复制语句“A=B”给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变。
JAVA中复制数组元素值的的方法指深拷贝
1 使用for循环,将数组的每个元素复制(需要将每个对象调用clone方法,才能实现真正的复制)
2 使用clone方法,得到数组的值,而不是引用
3 使用System.arraycopy方法
注意:
1.上面方法中arraycopy效率较高。
2. 以上所说的拷贝数组的方法,只是针对一维数组,对于多维数组,要在每一维用以上方法进行复制才能实现复制数组元素的值而不是引用。
3. clone 和 arraycopy对二维数组进行复制时,是浅拷贝, 即
System.arraycopy(this.QPN, 0, UQPN, 0, this.QPNNumber);
这样做数组元素只复制了引用。新旧数组指向相同的内存地址,(不论对象数组,还是基本类型数组)。正确的方法为:
for(int i = 0; i < this.QPNNumber; i++){
System.arraycopy(this.QPN[i], 0, UQPN[i], 0, this.QPNNumber);
}