System.arraycopy 源码
/**
* src 源数组
* srcPos 源数组的起始位置
* dest 目标数组
* destPos 目标数组的起始位置
* length 复制元素的数量
*/
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,int length);
举例:
数组a [0,1,2]
数组b[]
System.arraycopy(a,1,b,2,2);
得到的结果为数组b[0,0,1,2]
从数组a角标为1的位置开始,复制两个元素,也就是1,2,到数组b的第二位开始
控制台打印
public static void main(String[] args) {
int[] a = new int[3];
int[] b = new int[4];
a[0] = 0;
a[1] = 1;
a[2] = 2;
//从数组a的第1位开始,复制两个元素到数组b的第二位开始
System.arraycopy(a,1,b,2,2);
for (int i = 0; i < b.length; i++){
System.out.println("b : " + b[i]);
}
}
结果
b : 0
b : 0
b : 1
b : 2
Arrays.copyOf() 源码
/**
* original 源数组
* newLength 新数组的长度
*/
public static int[] copyOf(int[] original, int newLength) {
//定义一个新数组
int[] copy = new int[newLength];
//调用System.arraycopy方法进行复制
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
可以看到Arrays.copyOf方法中,还是调用了System.arraycopy,并且默认了从源数组的第0位开始复制到目标数组的第0位,复制元素的数量取源数组长度和目标数组长度的最小值。简单来说,目标数组比源数组长,那就全复制过来后边为0(相当于 扩容),如果目标数组比源数组短,那就截取源数组