Java中对于二维数组的clone
昨天写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(""); } } }
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: TP5 函数助手实例说明
- 下一篇: PHP 防止 while true循环 CPU 使用率过高的方法