Java中对于二维数组的clone

来源:互联网 发布:数据口径不一致的意思 编辑:程序博客网 时间:2024/05/22 00:33

    昨天写Java的时候写了一行int[][] c = a.clone(),结果发现后续对c的操作同时也作用到了a上了,当时一脸懵逼啊,说好的clone呢,怎么引用又扯不干净了。单步调试看看,好家伙,还真的是……

    今天上网查了查,原来因为Java跟C/C++一样,没有二维数组,二维数组是一维数组的一维数组,用int[][] c = a.clone(),实际上是把a[0],a[1],a[2]给clone了一份给c,也就是把每一行的一维数组的引用拷贝了一份给c,但是这些引用所指向的内存空间还是原来那一块,并不是彻底的深拷贝,在后续对c的操作中还是会同时作用在a上。因此应该对每一行的一维数组分别进行clone,才是彻底的深拷贝。




测试代码:

package package2;public class Test {public static void main(String[] args) {int[][] a = new int[3][3];int cnt = 0;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {a[i][j] = ++cnt;}}int[][] b = new int[3][];for (int i = 0; i < 3; i++) {b[i] = a[i].clone();}b[0][0] = -1;System.out.println("a:");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {System.out.print(a[i][j] + " ");}System.out.println("");}System.out.println("");System.out.println("b:");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {System.out.print(b[i][j] + " ");}System.out.println("");}System.out.println("");int[][] c = a.clone();c[0][0] = -2;System.out.println("a:");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {System.out.print(a[i][j] + " ");}System.out.println("");}System.out.println("");System.out.println("c:");for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {System.out.print(c[i][j] + " ");}System.out.println("");}}}


0 0
原创粉丝点击