Java 数组 浅拷贝与深拷贝

定义一个数组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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值