Arrays中 copyOf 和 System 中 arraycopy 兩者的區別

【爲什麼會寫這篇博文?】
花花❀看到 Arrays 源碼中的 copyOf 方法,底層調用的是 System 中 arraycopy 方法,而且我已經掉過不止一次數組複製的坑🕳,今天就打算寫個博客給我長個記性。
Arrays是一個工具類,該類中幾乎所有的方法都是靜態方法,也就是說可以通過類名來調用相應的方法。

首先來看以下 copyOf 源碼

    public static <T> T[] copyOf(T[] original, int newLength) {
        return (T[]) copyOf(original, newLength, original.getClass());
    }
    
    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;
    }

【參數解析】
original:原數組
newLength:數組長度
newType:數組類型
/----------------------------------------------------------/
可以看到 Arrays 中底層的 copyOf 方法首先保證新數組的類型和原數組是相等的,再調用 System.arraycopy 方法去複製數組。
Arrays 中都調用的 System 中的方法,那麼兩者有什麼區別呢?

我們再來看一下 System.arraycopy 方法源碼

    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

【參數解析】
src:原數組
srcPos:開始複製的位置
dest:目標數組
destPos:複製的開始位置
length:數組長度
src和dest必須是同類型或者可以進行轉換類型的數組
/----------------------------------------------------------/
我們可以看出 System.arraycopy 方法爲本地方法,底層的原理現在學Java的我可能需要C同學的幫助啦🤭

使用總結

copyOf 方法 arraycopy 方法
調用時只需要原數組即可 調用時需要原數組和目標數組
有返回值 無返回值
新建一個對象,並調用arraycopy方法 底層方法

擴展

一維數組的複製

一維數組的四種複製方式:

  1. for循環挨個複製
  2. 調用 System.arraycopy 方法
  3. 調用 Arrays.copyOf 方法
  4. 調用 object 中的 clone 方法

for循環太簡單啦,就沒測試啦,同時我們可以看出一維數組的三種方式都是 深拷貝!

public static void main(String[] args){
    int[] arr = {1,2,3};
    int[] brr =new int[3];
    System.arraycopy(arr,0,brr,0,arr.length);
    int[] crr = Arrays.copyOf(arr, arr.length);
    int[] drr = arr.clone();
    arr[0] = 0;
    System.out.println("arr:  " +Arrays.toString(arr));
    System.out.println("System.arraycopy:  " + Arrays.toString(brr));
    System.out.println("Arrays.copyOf:  " + Arrays.toString(crr));
    System.out.println("clone: " + Arrays.toString(drr));
}

運行結果

arr:  [0, 2, 3]
System.arraycopy:  [1, 2, 3]
Arrays.copyOf:  [1, 2, 3]
clone: [1, 2, 3]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章