System. arraycopy()入门指南

System. arraycopy()入门指南

System. arraycopy()源码

System. arraycopy()入门指南

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

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

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

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

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

System. arraycopy()入门指南

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

System. arraycopy()入门指南

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

代码如下所示

System. arraycopy()入门指南

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

System. arraycopy()入门指南

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

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

System. arraycopy()入门指南

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

System. arraycopy()入门指南

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

比如下面的代码

System. arraycopy()入门指南

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

System. arraycopy()入门指南

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

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

System. arraycopy()入门指南

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

System. arraycopy()入门指南


分享到:


相關文章: