System.arraycopy原生的方法有多么牛逼,你看了就知道

250 阅读2分钟

这是我参与新手入门的第1篇文章

开场

熟悉HashMap的小伙伴应该都知道在map内部发生rehash的时候回将数据进行赋值移位,那么针对数组的移位是通过复制数据最终会使用底层的一个arraycopy方法。关于这个方法我们有多少了解呢?。hashmap在进行扩容的时候会对数组进行重排,重排的时候我们用到一个原生的方法System.arraycopy . 关于这个方法就是我们本章节的药引。

方法详述

  • public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);

功能简述

从指定的位置开始从原数组中复制到目标数组中的指定位置。 来自src数组的子序列复制到了dest数组中。该子序列的长度为length 该序列是原数组中[srcPos,srcPos_length-1]段且被复制到了目标数 组中的[destPos,destPos+length-1]位置。 如果src,dest参数引用同一数组对象对象,当执行复制的时候会先从原数& 组中去除子序列到暂存区,然后再从暂存区复制到目标数组的指定位置. 如果src或者dest一个为空则抛出NullPointerException,值得注意的 是,如果src为空则跑出NullPointerException且dest数组不受影响。

  • 发生以下情况 会抛出ArrayStoreException
  • 1.src指向不是数组
  • 2.dest指向不是数组
  • 3.src,dest元素类型是不相同的
  • 4.src元素是值传递,dest元素之引用传递类型
  • 5.src元素是引用传递,dest元素之值传递类型

  • 发生以下情况 会抛出IndexOutOfBoundsException
  • srcPos 是负数
  • destPos 是负数
  • lenght 是负数
  • srcPos+length>src.length
  • destPos+length>dest.length

  • 否则其他来自原数组的其他子序列不能通过赋值转换的目标数组的类型就会* 抛出ArrayStoreException,在这种情况下,我们会找到一个最小的非负* 数K满足 src[srcPos+k]不能赋值到dest数组中从而抛出Exception.这* 时src数组[srcPos,srcPos+k-1]段序列会被复制到dest[destPos, * destPos+k-1]段的。
  • 因为已经列出了限制,所以本段序列只适合引用类型的数组元素 */

总结

  • 在原生提供的方法基础上实现功能是必要的,因为他们会为我们考虑到内存的消耗,在项目性能上会得到最大的保证。但是往往类似这种原生的函数功能,我们实际很少使用。因为已经被其他的框架封装了。这也是我的误区之一。