1. 程式人生 > >System.arraycopy方法詳解

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;
	
	}