从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束

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】

 

 

 

posted on 2012-08-04 16:18  Coffee_Guy  阅读(15189)  评论(0编辑  收藏  举报