1. 程式人生 > >Arrays.copyof(···)與System.arraycopy(···)區別

Arrays.copyof(···)與System.arraycopy(···)區別

首先觀察先System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)的宣告:
public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

src - 源陣列。
srcPos - 源陣列中的起始位置。
dest - 目標陣列。
destPos - 目標資料中的起始位置。
length - 要複製的陣列元素的數量。
該方法是用了native關鍵字,呼叫的為C++編寫的底層函式,可見其為JDK中的底層函式。
再來看看Arrays.copyOf();該方法對於不同的資料型別都有相應的方法過載。

//複雜資料型別
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
public static <T> T[] copyOf(T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}

由U型別複製為T型別?
original - 要複製的陣列
newLength - 要返回的副本的長度
newType - 要返回的副本的型別

//基本資料型別(其他類似byte,short···)
public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }
觀察其原始碼發現copyOf(),在其內部建立了一個新的陣列,然後呼叫arrayCopy()向其複製內容,返回出去。
總結:
1.copyOf()的實現是用的是arrayCopy();
2.arrayCopy()需要目標陣列,對兩個陣列的內容進行可能不完全的合併操作。
3.copyOf()在內部新建一個數組,呼叫arrayCopy()將original內容複製到copy中去,並且長度為newLength。返回copy;