Arrays.copyOf()
和 System.arraycopy()
的区别和联系
1、System.arraycopy
方法作用:将源数组的一段 复制到 目标数组中的某个地方
@HotSpotIntrinsicCandidate
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos, int length);
参数说明:
src
: 源数组
srcPos
:从原数组中的哪个索引开始
dest
:目标数组
destPos
:放在目标数组中的哪个索引开始
length
:长度
- 这个方法是
System
下, 被native
关键字修饰的方法,所以该方法是由别的语言写的 - 如果
length
超过了原数组或者目标数组的起始索引都会报错 - 该方法必须有原数组和目标数组
- 元数组和目标数组可以是相同的,实现对自身数组的操作(
ArrayList
的add
、remove
方法)
// 模拟arrayList的add方法
// 删除索引为4,值为5的元素,就要将要删除元素之后第一个到最后一个所有元素向前移动一位
int[] array = {1, 2, 3, 4, 5, 6, 7, 0, 0, 0};
System.out.println("原来的Array:" + Arrays.toString(array));
//
System.arraycopy(array, 4+1, array, 4, 7-(4+1));
System.out.println("拷贝后的Array:" + Arrays.toString(array));
// 原来的Array:[1, 2, 3, 4, 5, 6, 7, 0, 0, 0]
// 拷贝的Array:[1, 2, 3, 4, 6, 7, 0, 0, 0, 0]
2、Arrays.copyOf()
方法作用:生成一个源数组中的所有元素或者从开头的一段元素 复制到新数组中的最前面
public static T[] copyOf(T[] original, int newLength) {
T[] copy = new T[newLength];
System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
return copy;
}
参数说明
original
:源数组
newLength
:新生成的数组长度
返回值:T
:生成新的数组
- 该方法内部调用了
System.arraycopy
方法,所有消耗较大 - 该方法可以生成一个复制数组,该数组可以是源数组从开头的一部分,也可以是源数组,也可以多于原数组,取决于自己给的长度
- 不能复制原数组中的不从开头开始的一段,也不能指定复制到新数组中的某个位置
int[] array = {1, 2, 3, 4, 5};
int[] array2;
array2 = Arrays.copyOf(array, array.length - 2);
System.out.println(Arrays.toString(array2));
// [1, 2, 3]
array2 = Arrays.copyOf(array, array.length);
System.out.println(Arrays.toString(array2));
// [1, 2, 3, 4, 5]
array2 = Arrays.copyOf(array, array.length + 2);
Sys1tem.out.println(Arrays.toString(array2));
// [1, 2, 3, 4, 5, 0, 0]