Arrays.copyOf() 与 System.arraycopy()
查看JDK1.8 中的Arrays.java 中的方法 会发现 ,针对copyOf() ,针对不同的数据类型 提供了不同的方法 ;
那就 copyOf(int[],int) 和 copyOf(U[],int,Class<?extends T[]>) 这两个方法 为例子
先来看 copyOf(int[],int) :会发现 底层是基于System.arraycopy() 实现的
// 源码实现
// original: 要被复制的数组
// newLength: 返回的新数组长度
// 返回原始数组的副本,截断或填充零,获得规定的长度
// @throws NegativeArraySizeException : 如果newLength为负 ,需抛出异常。
// @throws NullPointerException : 如果original为null ,需抛出异常。
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
// System.arraycopy()
// src: 原始数组
// srcPos: 原始数组的起始位置
// dest: 要被复制的目标数组
// destPos: 被复制数组的起始位置
// length: 要被复制的元数个数
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
举个例子:
public class Test {
public static void main(String[] args) {
int a[] ={1,2,3,4,5,6,7,8};
int b[] = Arrays.copyOf(a,4);
for (int c:b) {
System.out.print(c+"-");
}
}
}
输出结果: 1-2-3-4-
再来看 copyOf(U[],int,Class<?extends T[]>) 在ArrayList 源码中 会看到这个方法:
// 看过源码的 见到这些参数 和 抛出可能会发生异常
// <T,U> : T(指返回的目标数组中对象类) U(指原始数组中的对象类)
// U[] original : 要被复制的数组
// newLength : 要返回的副本的长度
// newType :要返回的副本的类
// @throws NegativeArraySizeException : 如果 newLength 为负,需抛出异常。
// @throws NullPointerException : 如果 original 为null,需抛出异常。
// @throws ArrayStoreException : 如果 original 复制到目标数组的类型,不是该数组可存储类型,需抛出异常。
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;
}