Arrays.copyof(···)與System.arraycopy(···)區別
阿新 • • 發佈:2019-02-03
首先觀察先System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)的宣告:
總結:
1.copyOf()的實現是用的是arrayCopy();
2.arrayCopy()需要目標陣列,對兩個陣列的內容進行可能不完全的合併操作。
3.copyOf()在內部新建一個數組,呼叫arrayCopy()將original內容複製到copy中去,並且長度為newLength。返回copy;
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 - 要返回的副本的型別
觀察其原始碼發現copyOf(),在其內部建立了一個新的陣列,然後呼叫arrayCopy()向其複製內容,返回出去。//基本資料型別(其他類似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; }
總結:
1.copyOf()的實現是用的是arrayCopy();
2.arrayCopy()需要目標陣列,對兩個陣列的內容進行可能不完全的合併操作。
3.copyOf()在內部新建一個數組,呼叫arrayCopy()將original內容複製到copy中去,並且長度為newLength。返回copy;