JAVA二维数组拷贝

原帖地址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);
     }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值