Java 数组 浅拷贝与深拷贝

时间:2021-08-08 21:59:40

http://www.cppblog.com/baby-fly/archive/2010/11/16/133763.html

定义一个数组int[] a={3,1,4,2,5}; int[] b=a;  数组b只是对数组a的又一个引用,即浅拷贝。如果改变数组b中元素的值,其实是改变了数组a的元素的值

要实现深度复制,可以用clone或者System.arrayCopy
如下面的代码

1  int [] a = { 3 , 1 , 4 , 2 , 5 };
2  int [] b = a.clone();
3  b[ 0 ] = 10 ;
4  System.out.println(b[ 0 ] + "    " + a[ 0 ]);

 输出为10  3
可见改变了b的值,但是没有改变a的元素的值

但是clone和System.arrayCopy都是对一维数组的深度复制。对于二维数组

1  int [][] a = {{ 3 , 1 , 4 , 2 , 5 },{ 4 , 2 }};
2  int [][] b = a.clone();
3  b[ 0 ][ 0 ] = 10 ;
4  System.out.println(b[ 0 ][ 0 ] + "    " + a[ 0 ][ 0 ]);

输出为10  10
所以clone并不能直接作用于二维数组
因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。
要证明,只需看下面的输出

1  int [][] a = {{ 3 , 1 , 4 , 2 , 5 },{ 4 , 2 }};
2  int [][] b = a.clone();
3  b[ 0 ][ 0 ] = 10 ;
4  System.out.println(b[ 0 ][ 0 ] + "    " + a[ 0 ][ 0 ]);
5  System.out.println(a[ 0 ] == b[ 0 ]);

第5句输出为true。

用clone对二维数组进行复制,要在每一维上调用clone函数

1  int [][] a = {{ 3 , 1 , 4 , 2 , 5 },{ 4 , 2 }};
2  int [][] b = new   int [a.length][];
3  for ( int  i = 0 ;i < a.length;i ++ ){
         b[i] = a[i].clone();
}
  b[ 0 ][ 0 ] = 10 ;
6  System.out.println(b[ 0 ][ 0 ] + "    " + a[ 0 ][ 0 ]);
7  System.out.println(b[ 0 ] == a[ 0 ]);

输出为
10  3
false