用System.arraycopy()fang方法复制数组

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)方法从源数组src的位置srcPos开始向目标数组dest的位置destPos开始复制length个元素。对于一维数组和高维数组,复制的结果完全不同。


例如以下程序:


import java.util.Arrays;

public class SystemArrayCopyTest {

   public static void main(String[] args) {

      int [ ] tset1 = new int [ ]{2,3,4,5,6,7,8} ;

      System.out.println(Arrays.toString(tset1));

      int [ ] test2 = new int [tset1.length] ;

      System.arraycopy(tset1, 0, test2, 0, tset1.length) ;  

      System.out.println(Arrays.toString(test2));

      test2[0] = 8;

      test2[1] = 88;

      System.out.println(Arrays.toString(test2));


      //只修改了复制的副本数组,原数组没有变,此时是值传递


      char [ ][ ]one = new char[][]{{'a','b'},{'c','d'},{'e','f'}};

      System.out.println(Arrays.toString(one[0]));

      char [ ][ ] another = new char [2][2];

      System.arraycopy(one, 0, another, 0, 2);

      System.out.println(Arrays.toString(another[0]));  

      //another[0][0] = 'x';     

      //another[0][1] = 'y';

      one[0][0] = 'x';

      one[0][1] = 'y';

      System.out.println(Arrays.toString(one[0]));

      System.out.println(Arrays.toString(another[0]));

   }

}


Java其实没有二维数组的概念,平常实现的二维数组只是元素是一维数组的一维数组,而数组也是引用类型,继承自Object类。数组是new出来的。这些性质也就导致arraycopy()二维数组时出现的问题。如果是一维数组,那么元素都是基础类型(如int,double等),使用arraycopy()方法后,是把原数组的值传给了新数组,属于值传递。而如果是二维数组,数组的第一维装的是一个一维数组的引用,第二维里是元素数值。对二维数组应用arraycopy()方法后,第一维的引用被复制给新数组的第一维,也就是两个数组的第一维都指向相同的“那些数组”。而这时改变其中任何一个数组的元素的值,其实都修改了“那些数组”的元素的值,所以原数组和新数组的元素值都一样了。


结果:


[2, 3, 4, 5, 6, 7, 8]  //一维数组的复制属于值传递  修改副本原来的不会变

[2, 3, 4, 5, 6, 7, 8]   //原来的

[8, 88, 4, 5, 6, 7, 8]  //复制来的


二维数组的复制结果是一维数组中的引用变量传递给副本一维数组了,那么两个数组的高维存储的当然是指向同一一维数组的引用变量,所以修改任意一个另一个也会改变


[a, b] 原来的[0]
[a, b] 副本[0]


修改任意一个后


[x, y] 原来的[0]

[x, y] 副本[0]


因而,用该方法复制数组时,如果是一维的基本类型数组,结果没有问题。如果是高维数组或引用类型(对象)数组,由于高维数组元素是引用,直接复制的结果相当于浅拷贝,正确的做法是使用循环,再用该方法一个一个元素的复制低维数组或对象。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值