arraycopy方法的作用_System. arraycopy()入门指南

952ad64a25cc9a44563cc0c7dc45d248.gif

System. arraycopy()源码

a558846ab68d66eb522de60a1c7898d7.png

从它的修饰符native来看,这个方法的源码是不能透漏给开发者来看的,因为native修改的方法,是由其它语言来实现的,一般是(C或C++),所以这没有办法看到源码了。

其实我们对于这个方法也不需要了解太多,只要知道它的基本使用就可以了,也就是知道arraycopy()方法里面的几个参数都是什么作用就好了

  • src参数:源数组
  • srcPos参数:从src数组的第几个元素开始赋值
  • dest参数:目标数组
  • destPos参数:指定从dest数组的第几个元素开始。
  • length参数:指定从src数组拿几个元素来赋值到dest数组

System. arraycopy()复制基本数据类型

这里以int为标准,代码如下所示

e117a4cbaf85d79daa5906aa3194660b.png

此时结果如下所示,可以看到上面的代码把src_arr数组从索引1开始把2个长度的22,33这两个元素给放到dest_arr数组里面的从索引2开始的索引2和索引3这两个位置上面

060387424b0dc37055402aae57f4529b.png

System. arraycopy()复制引用数据类型

代码如下所示

cf7fe1d6a531e56a3feefb49d0336e4b.png

然后此时运行结果如下所示,这里结果就不多讲了,也是复制成功的

1dbaeebd1206b9e367e5e7c96039d662.png

System. arraycopy()复制引用数据类型的浅拷贝问题

当使用System. arraycopy()进行复制的时候,拷贝数组里面的引用对象的时候,是浅拷贝,而不是深拷贝,证明如下

dea948e76e1274bbe2f6a8405fca42a4.png

结果如下所示,此时可以看到dest_arr数组里面的person对象的company变量和src_arr数组里面的person对象的company变量是指向同一个地址的,说明在复制的时候,没有把src_arr数组里面的person对象的company变量在重新生成一个对象,所以此时是浅拷贝

d73cab6966ad346f59a9b63a38c11521.png

既然是浅拷贝了,那么就会有一定的缺点,就是如果此时我修改src_arr数组里面的person对象的company变量里面的address变量地址,那么dest_arr数组里面的person对象的company变量的address变量地址也会修改了

比如下面的代码

0e4ba599bc3d8d72006b5217ed655d98.png

此时可以看到两次的获取dest_arr数组里面的person对象的company变量的address的值不同了

9e9f1af19260236c50b06741702e39f6.png

System. arraycopy()复制引用数据类型变成深拷贝

目前发现System. arraycopy()复制引用数据类型无法实现深入拷贝,所以目前实现数组的深拷贝的代码如下所示

85f3d0682dcd8a3ef5515175982bc42d.png

结果如下所示,此时可以看到,dest_arr数组里面的person对象的company变量和src_arr数组里面的person对象的company变量是不指向同一个地址的,所以此时对数组里面的引用数据类型是深入拷贝

f1743fcef90c3bb294dde83fb80e1987.png
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值