public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
這是一個native方法最終交給jni層處理硼被,用來拷貝數(shù)組
參數(shù)說明:
- src 數(shù)據(jù)源數(shù)組尖阔,需要從哪個數(shù)組拷貝數(shù)據(jù)
- srcPos 從src數(shù)據(jù)的那個位置開始拷貝
- dest 目標數(shù)組仪或,把src里面的數(shù)據(jù)拷貝到這里
- destPos 開始填充數(shù)據(jù)的下標位置
- length 從src數(shù)據(jù)中拷貝多少個數(shù)據(jù)
列子:
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 + ",");
}
將數(shù)組original數(shù)據(jù)的第4個位置開始拷貝瑟俭,一共拷貝length-4個數(shù)組旧找,依次從copy數(shù)組第五個開始存放瘟裸。
輸出:
0,1,2,3,123,4,5,6,7,8,9,0
這個就是ArrayList.add(index , E) 的實現(xiàn)原理:
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在插入數(shù)據(jù)的時候先要進行擴容(如果有需要),然后拷貝數(shù)組,所以說ArrayList如果有頻繁插入和刪除的操作的話會非常消耗性能的域慷,建議使用LinkedList。LinkedList是一個雙向鏈表結(jié)構(gòu)汗销,插入數(shù)據(jù)快犹褒,查找數(shù)據(jù)慢。