Java中 System.arraycopy() 和 Arrays.copyOf()方法


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() 是系統自動在內部新建一個數組,並返回該數組。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM