讲java的数组复制要从java的变量传递类型讲起。
java的变量传递分为值传递和引用传递。
基本数据类型的赋值是值传递,数组以及Class的的赋值是引用传递。
当我想保存数组a时,习惯性的采取了
<pre name="code" class="java">int[] a = {1,2,3} int[] b = a;因为数组的赋值是引用传递,所以a,b是指向同一块表示该数组内存地址
对a的操作,会影响到b的值,所以并没有起到保存a的作用。
对于一维数组来说,可以用
int[] a = {1,2,3} int[] b = a.clone();
对于多维数组,
int[][] a = {{1,2,3},{4,5,6}}; int [][] b = a.clone();
事实上,并没有起到作用,因为在java底层实现中多维数组是数组中的数组。因为这段的代码只是让a,b指向了不同的内存区域,假设为A,B,但A,B却又共同指向了里层数组arr1,arr2。
正确的代码是
public int[][] copy2DArr(int[][] a) { int[][] b = new int[a.length][2]; for (int i = 0; i < a.length; i++) { b[i] = a[i].clone(); } return b; }
所以调用clone()的对象一定要是代表多维数组最里层的的数组对象