Java中 System.arraycopy() 和 Arrays.copyOf()方法
阿新 • • 發佈:2019-02-08
index 成員 size obj lis sco 方法測試 新建 -a
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()
是系統自動在內部新建一個數組,並返回該數組。
Java中 System.arraycopy() 和 Arrays.copyOf()方法