函数的声明如下, 作用: 将src中的元素拷贝到dest中, 更具体一点就是, 将src中处于[srcPos, srcPos + length - 1]这段区间上的元素拷贝到dst的[destPos, destPos + length - 1]这段区间上
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
具体示例
int[] src = {2,4,6,8,10};
int length = src.length;
int[] dst = new int[10];
//下面这句的作用: 将src处于[0,length-1]这段区间上的元素拷贝到dst的[3, 3 + length - 1]这段区间上
System.arraycopy(src, 0, dst, 3, length);
System.out.println(Arrays.toString(dst));
/*
打印结果
[0, 0, 0, 2, 4, 6, 8, 10, 0, 0]
*/
可以发现, 使用System.arraycopy()进行数组的拷贝非常灵活, 可以选择拷贝的起点, 长度等参数, 其实Arrays.copyOf()就是使用System.arraycopy()实现的
示例1:
int[] arr = {1,3,5,7,9};
//将arr中的元素拷贝到长度为10的数组中, 并返回这个数组
int[] res = Arrays.copyOf(arr, 10);
System.out.println(Arrays.toString(res));
/*
打印结果
[1, 3, 5, 7, 9, 0, 0, 0, 0, 0]
*/
可以看到, 源数组的长度是5, 新数组的长度是10, 新数组中超出的部分取默认值
如果新数组的长度小于源数组长度会发生截断, 如下所示, 由于新数组的长度为3, 所以只会拷贝源数组的前三个元素到新数组中
示例2:
int[] arr = {1,3,5,7,9};
//将arr中的元素拷贝到长度为10的数组中, 并返回这个数组
int[] res = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(res));
/*
打印结果
[1, 3, 5]
*/
Arrays.copyOf()源码, 以int[]数组为例
public static int[] copyOf(int[] original, int newLength) {
//创建长度为newLength的数组
int[] copy = new int[newLength];
// 将original中处于[0, newLength- 1]这段区间上的元素拷贝到copy 的[0, Math.min(original.length, newLength)]这段区间上
// Math.min(original.length, newLength)是取original.length和newLength中的较小值,
// 如果newLength更小, 说明original中的元素不会全部拷贝, 这样拷贝结果就会发生截断
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
//返回新数组
return copy;
}