Arrays.copyof(···)與System.arraycopy(···)陣列元素複製區別
阿新 • • 發佈:2019-01-24
他們的區別就是 System.arraycopy不關心你是什麼資料型別,只是完成資料元素複製。Arrays.copyof方法是根據不同型別呼叫System.arraycopy方法完成複製內容。
System.arraycopy方法是一個本地方法的位元組複製函式;完成將src陣列指向的記憶體一部分複製到dest陣列指向的記憶體。
src 是原陣列,srcPos指定開始複製的下標
dest是複製的目的陣列,destPos表示目的陣列開始接受複製內容的下標
length表示這次複製的陣列元素個數
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
再來看看Arrays.copyOf();該方法對於不同的資料型別都有相應的方法過載。
這個位元組陣列複製時先定義了一個新位元組陣列,newLength長度。
然後呼叫System.arraycopy本地方法完成複製功能。
其他基本資料型別的複製都是一樣的模式。
public static byte[] copyOf(byte [] original, int newLength) {
byte[] copy = new byte[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
關於這個泛型的複製內容,關鍵是根據複製的original尋找到資料型別,構建一個newLength長的陣列。
public static <T,U> T[] copyOf(U[] original, int newLength, Class <? extends T[]> newType) {
@SuppressWarnings("unchecked")
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;
}