您的位置:首页 > 编程语言 > Java开发

Java 数组 浅拷贝与深拷贝

2013-11-12 17:04 127 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: