System中有很多不常用的方法,基本上都是native修饰方法,虽然不常用,但是可以有助于我们理解JDK的源码。
比如:arraycopy()在ArrayList中就用到了。
先说明一下该方法作用是:从一个数组中选择一些元素赋值到另一个数组中。
arraycopy源码:
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos, int length);
解释一下参数是什么意思:
Object src:原数组。
int srcPos:从原数组的起始位置开始。
Object dest:目标数组。
int destPos:目标数组的开始位置。
int length:要复制原数组的长度。
示例:
int[] src = new int[]{1, 2, 3, 4, 5};
int[] dest = new int[5];
System.arraycopy(src, 0, dest, 0, 5);
for (int a : src) {
System.out.print(a + " ");
}
System.out.println("");
for (int a : dest) {
System.out.print(a + " ");
}
--输出结果:
-- 1 2 3 4 5
-- 1 2 3 4 5
注意下上面和下面两个例子的区别,dest数组在下面例子中有6个元素,都是9,复制之后dest的前5个元素变成了1 2 3 4 5
int[] src = new int[]{1, 2, 3, 4, 5};
int[] dest = new int[]{9, 9, 9, 9, 9, 9};
System.arraycopy(src, 0, dest, 0, 5);
for (int a : src) {
System.out.print(a + " ");
}
System.out.println("");
for (int a : dest) {
System.out.print(a + " ");
}
-- 输出结果
-- 1 2 3 4 5
-- 1 2 3 4 5 9
如果dest长度是10,复制的元素只有5个,则其余自动补0,如下:
int[] src = new int[]{1, 2, 3, 4, 5};
int[] dest = new int[10];
System.arraycopy(src, 0, dest, 3, 5);
for (int a : src) {
System.out.print(a + " ");
}
System.out.println("");
for (int a : dest) {
System.out.print(a + " ");
}
-- 输出结果:
-- 1 2 3 4 5
-- 0 0 0 1 2 3 4 5 0 0
还有像是ArrayList源码中add(int index , E element)方法
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1);
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
我们都知道ArrayList的底层是使用数组存储元素的,所以这个意思就是在往List中通过从方法添加元素时,会先将数组中index后面的元素复制到index后面,也就是将index后面的元素都往后移一位,在将新元素element添加到index这个位置。