java原生的功能到底有多强大呢

69 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

开场

还记得上章节我们说的HashMap吗,当时我们留了一个小彩蛋。hashmap在进行扩容的时候会对数组进行重排,重排的时候我们用到一个原生的方法System.arraycopy . 关于这个方法就是我们本章节的药引。

方法详述

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

  • 发生以下情况 会抛出ArrayStoreException

  • 1.src指向不是数组

  • 2.dest指向不是数组

  • 3.src,dest元素类型是不相同的

  • 4.src元素是值传递,dest元素之引用传递类型

  • 5.src元素是引用传递,dest元素之值传递类型

功能简述

从指定的位置开始从原数组中复制到目标数组中的指定位置。 来自src数组的子序列复制到了dest数组中。该子序列的长度为length 该序列是原数组中[srcPos,srcPos_length-1]段且被复制到了目标数 组中的[destPos,destPos+length-1]位置。 如果src,dest参数引用同一数组对象对象,当执行复制的时候会先从原数& 组中去除子序列到暂存区,然后再从暂存区复制到目标数组的指定位置. 如果src或者dest一个为空则抛出NullPointerException,值得注意的 是,如果src为空则跑出NullPointerException且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]段的。
  • 因为已经列出了限制,所以本段序列只适合引用类型的数组元素 */