System.arraycopy()
以add方法为例:
/**
* 在此列表中的指定位置插入指定的元素。
* 先调用 rangeCheckForAdd 对index进行界限检查;然后调用 ensureCapacityInternal 方法保证capacity足够大;
* 再将从index开始之后的所有成员后移一个位置;将element插入index位置;最后size加1。
*/
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1);
//arraycopy()方法实现数组自己复制自己
/**
elementData : 源数组;
index : 源数组中的起始位置;
elementData : 目标数组;
index + 1 : 目标数组中的起始位置;
size - index : 要复制的数组元素的数量;
*/
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
简单的方法测试:
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[10];
int[] b = new int[10];
a[0] = 1;
a[1] = 2;
a[2] = 3;
a[3] = 4;
System.out.println("原数组:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]+" ");
}
System.arraycopy(a, 2, b, 3, 2);
b[2]=7;
System.out.println();
System.out.println("处理之后数组:");
for (int i = 0; i < b.length; i++) {
System.out.print(b[i]+" ");
}
}
Arrays.copyOf()方法
主要是为了给原有数组扩容。
/**
以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。
*/
public Object[] toArray() {
//elementData:要复制的数组;size:要复制的长度
return Arrays.copyOf(elementData, size);
}
区别:
arraycopy() 需要目标数组,将原数组拷贝到你自己定义的数组里或者原数组,而且可以选择拷贝的起点和长度以及放入新数组中的位置 copyOf() 是系统自动在内部新建一个数组,并返回该数组。