1. 程式人生 > >Arrays.copyOf() 方法理解

Arrays.copyOf() 方法理解

最近看線性表、棧、佇列資料結構實現原始碼時,經常看到 Arrays.copy()、System.arraycopy() 方法,以下稍作整理。

Array.copyOf() 用於複製指定的陣列內容以達到擴容的目的,該方法對不同的基本資料型別都有對應的過載方法,詳見 java api:
這裡寫圖片描述
本文只介紹其中的copyOf(U[] original, int newLength, Class<? extends T[]> newType)方法,基本型別的過載方法比該方法少一個 Class 型別的入參而已,該方法原始碼如下:

/**
 * @Description 複製指定的陣列, 如有必要用 null 擷取或填充,以使副本具有指定的長度
 * 對於所有在原陣列和副本中都有效的索引,這兩個陣列相同索引處將包含相同的值
 * 對於在副本中有效而在原陣列無效的所有索引,副本將填充 null,當且僅當指定長度大於原陣列的長度時,這些索引存在
 * 返回的陣列屬於 newType 類
 
 * @param original 要複製的陣列
 * @param newLength 副本的長度
 * @param newType 副本的類
 * 
 * @return T 原陣列的副本,擷取或用 null 填充以獲得指定的長度
 * @throws NegativeArraySizeException 如果 newLength 為負
 * @throws NullPointerException 如果 original 為 null
 * @throws ArrayStoreException 如果從 original 中複製的元素不屬於儲存在 newType 類陣列中的執行時型別

 * @since 1.6
 */
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;
}

從程式碼可知,陣列拷貝時呼叫的是本地方法 System.arraycopy() ;
Arrays.copyOf()方法返回的陣列是新的陣列物件,原陣列物件仍是原陣列物件,不變,該拷貝不會影響原來的陣列。

System.arraycopy() 原始碼如下:

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

引數說明:
src:源物件
srcPos:源陣列中的起始位置
dest:目標陣列物件
destPos:目標資料中的起始位置
length:要拷貝的陣列元素的數量


參考資料:

JDK API 1.6幫助文件