System.arraycopy()
和 Arrays.copyOf()
方法
閱讀源碼的話,我們就會發現 ArrayList 中大量調用了這兩個方法。比如:我們上面講的擴容操作以及add(int index, E element)
、toArray()
等方法中都用到了該方法!
System.arraycopy()
方法
/**
* 在此列表中的指定位置插入指定的元素。
*先調用 rangeCheckForAdd 對index進行界限檢查;然后調用 ensureCapacityInternal 方法保證capacity足夠大;
*再將從index開始之后的所有成員后移一個位置;將element插入index位置;最后size加1。
*/
public void add(int index, E element) {
rangeCheckForAdd(index);
ensureCapacityInternal(size + 1); // Increments modCount!!
//arraycopy()方法實現數組自己復制自己
//elementData:源數組;index:源數組中的起始位置;elementData:目標數組;index + 1:目標數組中的起始位置; size - index:要復制的數組元素的數量;
System.arraycopy(elementData, index, elementData, index + 1, size - index);
elementData[index] = element;
size++;
}
我們寫一個簡單的方法測試以下:
public class ArraycopyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a = new int[10];
a[0] = 0;
a[1] = 1;
a[2] = 2;
a[3] = 3;
System.arraycopy(a, 2, a, 3, 3);
a[2]=99;
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
}
結果:
0 1 99 2 3 0 0 0 0 0
Arrays.copyOf()
方法
/**
以正確的順序返回一個包含此列表中所有元素的數組(從第一個到最后一個元素); 返回的數組的運行時類型是指定數組的運行時類型。
*/
public Object[] toArray() {
//elementData:要復制的數組;size:要復制的長度
return Arrays.copyOf(elementData, size);
}
個人覺得使用 Arrays.copyOf()
方法主要是為了給原有數組擴容,測試代碼如下:
public class ArrayscopyOfTest {
public static void main(String[] args) {
int[] a = new int[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
int[] b = Arrays.copyOf(a, 10);
System.out.println("b.length"+b.length);
}
}
結果:
10
兩者聯系和區別
聯系:
看兩者源代碼可以發現 copyOf() 內部實際調用了 System.arraycopy()
方法
區別:
arraycopy()
需要目標數組,將原數組拷貝到你自己定義的數組里或者原數組,而且可以選擇拷貝的起點和長度以及放入新數組中的位置 copyOf()
是系統自動在內部新建一個數組,並返回該數組。