他们的区别就是 System.arraycopy不关心你是什么数据类型,只是完成数据元素复制。Arrays.copyof方法是根据不同类型调用System.arraycopy方法完成复制内容。
System.arraycopy方法是一个本地方法的字节复制函数;完成将src数组指向的内存一部分复制到dest数组指向的内存。
src 是原数组,srcPos指定开始复制的下标
dest是复制的目的数组,destPos表示目的数组开始接受复制内容的下标
length表示这次复制的数组元素个数
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
再来看看Arrays.copyOf();该方法对于不同的数据类型都有相应的方法重载。
这个字节数组复制时先定义了一个新字节数组,newLength长度。
然后调用System.arraycopy本地方法完成复制功能。
其他基本数据类型的复制都是一样的模式。
public static byte[] copyOf(byte[] original, int newLength) {
byte[] copy = new byte[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
关于这个泛型的复制内容,关键是根据复制的original寻找到数据类型,构建一个newLength长的数组。
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}