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方法