1. 程式人生 > >Java中 System.arraycopy() 和 Arrays.copyOf()方法

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

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()方法