【Java源码分析】Java复制数组的方法
System.arraycopy方法
* @param src the source array.
* @param srcPos starting position in the source array.
* @param dest the destination array.
* @param destPos starting position in the destination data.
* @param length the number of array elements to be copied.
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
从源码我们可以看出,这是一个本地方法,是由C语言实现的,对比我们自己实现的方法会显得非常地高效。
使用示例
@Test
public void test01(){
int[] arr = {1, 2, 3, 4, 5};
int[] arrcp = new int[arr.length];
System.arraycopy(arr, 0, arrcp, 0, arr.length);
System.out.println(Arrays.toString(arrcp));
}
System.arraycopy是非常强大的方法。
但有一个小瑕疵,就是参数略多,尤其是当我们需要赋值同样一份数组的时候,竟然还需要自己定义新的数组。为了简化编程,JDK1.6为我们带来了Arrays.copyOf 和 Arrays.copyOfRange,这是一系列的重载方法,是对System.arraycopy的再次封装,所以,性能也是不容置疑的。
接下来,我们尝试使用Arrays.copyOf 和 Arrays.copyOfRange。
Arrays.copyOf 和 Arrays.copyOfRange
源码
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;
}
public static int[] copyOfRange(int[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
int[] copy = new int[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
使用示例
@Test
public void test02(){
int[] arr = {1, 2, 3, 4, 5};
// int[] arrcp = new int[arr.length];
// System.arraycopy(arr, 0, arrcp, 0, arr.length);
int[] arrcp1 = Arrays.copyOf(arr, arr.length);
System.out.println("arr == arrcp1 ? " + (arr == arrcp1));
System.out.println(Arrays.toString(arrcp1));
System.out.println();
int[] arrcp2 = Arrays.copyOfRange(arr, 1, 3);
System.out.println("arr == arrcp2 ? " + (arr == arrcp2));
System.out.println(Arrays.toString(arrcp2));
}
执行结果如下:
arr == arrcp1 ? false
[1, 2, 3, 4, 5]
arr == arrcp2 ? false
[2, 3]
之前自己太懒惰,懒得记忆这些方法和参数,今天特意小结下,以后关于复制数组的操作,就使用 Arrays.copyOf 和 Arrays.copyOfRange了,
参考
System和Arrays源码