Arrays.copyOf() 方法理解
阿新 • • 發佈:2018-12-25
最近看線性表、棧、佇列資料結構實現原始碼時,經常看到 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幫助文件