Arrays.copyOf()與System.arraycopy() 認識

Talk is cheap , Show me the code.

基本用法

最近在看jdk源碼,這兩個方法經常出現,用來複制一個新的數組,所以自己總結一下。

Arrays.copyOf()

語法

public static <T> T[] copyOf(T[] original,int newLength)

Parameters:
original  被複制的數組
newLength 新數組的長度

Returns:
被複制的數組,如果newLength比 original.length大,就用null來填充

Throws:
NegativeArraySizeException  如果newLength是負數就拋出該異常
NullPointerException  如果original是null就拋出該異常

這是一個泛型方法,泛型可以理解成一個模板方法,各種類型的方法可以套用這個模板,成爲實例。
比如:

public static byte[] copyOf(byte[] original, int newLength)public static short[] copyOf(short[] original, int newLength) ;
public static int[] copyOf(int[] original, int newLength);

我們來看看裏面具體的方法(源碼是jdk1.8)

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")  
        //三元運算符,如果newType 是Object[] 類型的,就直接強制轉換成newLength大小的T[]類型數組,不是Object[]類型的,就利用反射新建T[]類型數組
       // 非數組類型是不能通過getComponentType()方法獲得元素的Class對象類型
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
            
         // 這裏也是用到System.arraycopy(),下面說一下它的語法
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

System.arraycopy()

語法

 public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);
  Parameters:
  src  原數組
  srcPos 從原數組開始的地方
  dest  新數組,就是從原數組中複製後存儲的地方
  destPos 從新數組開始的地方
  length  要複製的數量
  其實就是從srcPos到srcPos+length-1 複製到 desPos到desPos+length-1 位置
  爲啥減1,因爲數組的位置從0開始
   
   Throws:
   IndexOutOfBoundsException 如果複製的數組元素數量大於新數組的長度,就拋出越界異常
   ArrayStoreException  如果原數組的類型和新數組的類型不一致
   NullPointerException 如果原數組或者新數組中有一個爲null

好了,瞭解了System.arraycopy()方法後,再看到

 System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
// 取其中的更小數                         
Math.min(original.length,newLength)
// 如果 newLength 小,就複製原數組的一部分數據
// 如果 original.length 小,與newlength相差的部分用null補充 

您可能對以下文章感興趣
What is SuppressWarnings (“unchecked”) in Java?
Java的native方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章