初学java,简单提到了数组赋值,于是自己动手代码实践联系一下。首先使用了system.arraycopy()这个方法,在一维数组中的使用十分简单方便。
int []a= {1,2,3,4};
int []b=new int [a.length];
System.arraycopy(a, 0, b, 0, a.length);
a[2]=8;
System.out.println(Arrays.toString(b));
这是一种直接复制再赋值的方式,和int []b =a; 这种指向内存的方式不一样,改变a数组的内容并不会改变b数组的内容。结果如下
[1, 2, 3, 4]
处于好奇心的驱使,我想测试一下这种方法对于二维数组的复制会有什么效果,于是编写了以下代码测试。
int [][]a=new int[][] {{1,2,3,4,5},{2,3,4,5},{3,4,5,6}};
int [][]b=new int[3][3];
//b[2]=a[2];
//a[2][0]=10;
//System.arraycopy(a[2], 0, b[2], 0, 3);
System.arraycopy(a, 0, b, 0, 3);//全复制
//System.out.println(a.length);
System.out.println(Arrays.toString(b[0]));
System.out.println(Arrays.toString(b[1]));
System.out.println(Arrays.toString(b[2]));
输出的结果如下:
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5, 6]
与我预想的不一样,我本以为输出的会是三行三列,舍弃一些,但是并没有,于是修改代码将上边的system.arraycopy最后的3改成了2,结果如下
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[0, 0, 0]
我想可能这是按照行复制?但是想到b中的一维数组长度是3,为什么复制过来4个,5个都没发生异常????后来想了一下是不是类似上边说的指向了内存,于是又修改代码:
int [][]a=new int[][] {{1,2,3,4,5},{2,3,4,5},{3,4,5,6}};
int [][]b=new int[3][3];
System.arraycopy(a, 0, b, 0, 3);//全复制
a[2][0]=10;
System.out.println(Arrays.toString(b[0]));
System.out.println(Arrays.toString(b[1]));
System.out.println(Arrays.toString(b[2]));
输出结果如下:
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[10, 4, 5, 6]
我想这应该就是按照了指向内存的方式做了所谓的 “复制” ;也有可能是这种方法对于二维数组有其他方法。
使用for循环,对于a数组的每一个一维数组给b复制,貌似达成了深拷贝的效果,代码如下:
int [][]a=new int[][] {{1,2,3,4,5},{2,3,4,5},{3,4,5,6}};
int [][]b=new int [a.length][];
for(int i=0;i<a.length;i++) {
b[i]=new int [a[i].length];
System.arraycopy(a[i], 0, b[i], 0, a[i].length);
}
a[2][0]=10;
System.out.println(Arrays.toString(b[0]));
System.out.println(Arrays.toString(b[1]));
System.out.println(Arrays.toString(b[2]));
运行结果如图:
[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5, 6]
可以看出改变a的内容,b的内容也不会改变了。实现了深拷贝。此种方法需要注意在给b开辟空间的时候,需要在for循环中开辟和a一样的空间,否则会出现b数组没开辟空间或者越界的错误。
新手入门,如有指正,万分感谢!