System.arraycopy方法詳解
概述:
System.arraycopy是一個原生的方法,用於陣列間的複製,當然延伸功能完成陣列替換。
1、翻譯Java原始碼的註釋
public static native void arraycopy(Object
src, int srcPos, Object
dest, int destPos, int
length);
@param src 原陣列
* @param srcPos 原陣列開始位置
* @param dest 目標陣列
* @param destPos 目標陣列開始位置.
* @param length 複製的長度
* @exception IndexOutOfBoundsException 陣列越界
* @exception ArrayStoreException 型別不匹配
* @exception NullPointerException 原陣列或目標陣列為Null
從原陣列特定位置複製資料到目標陣列的特定位置,(簡單就是陣列之間複製),這裡說的原陣列在方法引數代表是src,目標陣列為dest,原陣列特定位置方法引數是srcPos,目標陣列特定位置為destPos, 複製的長度為length。
舉個例子
byte[] originalBytes={1,2,3,4,5,6};
byte[] targetBytes = {7,8,9};
System.arraycopy(originalBytes, 2, targetBytes , 0, 3);
結果為:
target:[3, 4, 5]
注意複製資料不要大於目標陣列的長度,原陣列資料偏移過後長度必須滿足需要複製的長度,否則丟擲陣列越界異常
繼續翻譯:
如果原陣列和目標陣列是一個相同的陣列,那麼它會先將需要複製的內容複製到一個臨時陣列中,然後再將臨時陣列複製該陣列中,中間增加一個臨時變數。
以下是異常相關:
如果目標陣列為null將會丟擲NullPointerException
如果原陣列為null將會丟擲NullPointerException,目標陣列不會修改。
以下條件滿足將會丟擲ArrayStoreException,且目標陣列不會改變:
- 1、原陣列或目標陣列引用的物件不是陣列型別
- 2、原陣列和目標陣列的原生型別不一樣,比如原陣列是int,目標陣列是double型別
- 3、原陣列引用的是原生型別,而目標陣列引用是引用型別,比如原陣列是int 目標陣列是某個物件的引用, 反之也不行
以下條件滿足將會丟擲IndexOutOfBoundsException,且目標陣列不會改變:
- 1、srcPos或destPos或length 為負數
- 2、srcPos+length 大於 src.length ,或者 destPos+length 大於 dest.length
2、例子完成byte陣列替換
/**
* 位元組陣列替換
* @param originalBytes 需要替換原陣列
* @param offset 原陣列偏移位置
* @param len 原陣列替換的長度 (替換原陣列舊內容offset 到len)
* @param replaceBytes 目標陣列(替換新的內容)
* @return
*/
public static byte[] bytesReplace(byte[] originalBytes, int offset, int len, byte[] replaceBytes) {
byte[] newBytes = new byte[originalBytes.length + (replaceBytes.length - len)];
System.arraycopy(originalBytes, 0, newBytes, 0, offset);
System.arraycopy(replaceBytes, 0, newBytes, offset, replaceBytes.length);
System.arraycopy(originalBytes, offset + len, newBytes, offset+replaceBytes.length, originalBytes.length - offset -len);
return newBytes;
}