关于复制数组方法system.arraycopy方法的疑惑、

初学java,简单提到了数组赋值,于是自己动手代码实践联系一下。首先使用了system.arraycopy()这个方法,在一维数组中的使用十分简单方便。

int []a= {1,2,3,4};
	int []b=new int [a.length];
	System.arraycopy(a, 0, b, 0, a.length);
	a[2]=8;
	System.out.println(Arrays.toString(b));

这是一种直接复制再赋值的方式,和int []b =a; 这种指向内存的方式不一样,改变a数组的内容并不会改变b数组的内容。结果如下

[1, 2, 3, 4]

处于好奇心的驱使,我想测试一下这种方法对于二维数组的复制会有什么效果,于是编写了以下代码测试。

int [][]a=new int[][] {{1,2,3,4,5},{2,3,4,5},{3,4,5,6}};
int [][]b=new int[3][3];
//b[2]=a[2];
//a[2][0]=10;
	//System.arraycopy(a[2], 0, b[2], 0, 3);
System.arraycopy(a, 0, b, 0, 3);//全复制
//System.out.println(a.length);
System.out.println(Arrays.toString(b[0]));
System.out.println(Arrays.toString(b[1]));
System.out.println(Arrays.toString(b[2]));

输出的结果如下:

[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5, 6]

与我预想的不一样,我本以为输出的会是三行三列,舍弃一些,但是并没有,于是修改代码将上边的system.arraycopy最后的3改成了2,结果如下

[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[0, 0, 0]

我想可能这是按照行复制?但是想到b中的一维数组长度是3,为什么复制过来4个,5个都没发生异常????后来想了一下是不是类似上边说的指向了内存,于是又修改代码:

int [][]a=new int[][] {{1,2,3,4,5},{2,3,4,5},{3,4,5,6}};
int [][]b=new int[3][3];

	
System.arraycopy(a, 0, b, 0, 3);//全复制

a[2][0]=10;

System.out.println(Arrays.toString(b[0]));
System.out.println(Arrays.toString(b[1]));
System.out.println(Arrays.toString(b[2]));
	

输出结果如下:

[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[10, 4, 5, 6]

我想这应该就是按照了指向内存的方式做了所谓的   “复制”  ;也有可能是这种方法对于二维数组有其他方法。

使用for循环,对于a数组的每一个一维数组给b复制,貌似达成了深拷贝的效果,代码如下:

	
int [][]a=new int[][] {{1,2,3,4,5},{2,3,4,5},{3,4,5,6}};
int [][]b=new int [a.length][];


	
for(int i=0;i<a.length;i++) {
	
	b[i]=new int [a[i].length];
	System.arraycopy(a[i], 0, b[i], 0, a[i].length);
}
a[2][0]=10;


System.out.println(Arrays.toString(b[0]));
System.out.println(Arrays.toString(b[1]));
System.out.println(Arrays.toString(b[2]));
	

运行结果如图:

[1, 2, 3, 4, 5]
[2, 3, 4, 5]
[3, 4, 5, 6]

可以看出改变a的内容,b的内容也不会改变了。实现了深拷贝。此种方法需要注意在给b开辟空间的时候,需要在for循环中开辟和a一样的空间,否则会出现b数组没开辟空间或者越界的错误。

新手入门,如有指正,万分感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值