public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
这是一个native方法最终交给jni层处理,用来拷贝数组
参数说明:
- src 数据源数组,需要从哪个数组拷贝数据
- srcPos 从src数据的那个位置开始拷贝
- dest 目标数组,把src里面的数据拷贝到这里
- destPos 开始填充数据的下标位置
- length 从src数据中拷贝多少个数据
列子:
int[] original = {0,1,2,3,4,5,6,7,8,9};
int[] copy = {0,1,2,3,4,5,6,7,8,9,0,0};
System.arraycopy(original, 4, copy, 5, original.length-4);
copy[4] = 123;
for(int item:copy) {
System.out.print(item + ",");
}
将数组original数据的第4个位置开始拷贝,一共拷贝length-4个数组,依次从copy数组第五个开始存放。
输出:
0,1,2,3,123,4,5,6,7,8,9,0
这个就是ArrayList.add(index , E) 的实现原理:
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
ArrayList在插入数据的时候先要进行扩容(如果有需要),然后拷贝数组,所以说ArrayList如果有频繁插入和删除的操作的话会非常消耗性能的,建议使用LinkedList。LinkedList是一个双向链表结构,插入数据快,查找数据慢。