System.arraycopy()是Java系統提供的用於數組復制的函數。了解該函數前,先了解以下概念。
1、Java中的深復制和淺復制:
深復制:可以復制對象的內容和引用。例如:值拷貝。
淺復制:僅復制對象的引用。例如:對象拷貝(拷貝的是地址)。
2、函數原型:
public static native void arraycopy(Object src, int srcPos, Object dst, int dstPos, int length); src:原數組對象 srcPos:copy的起始位置 dst:目標數組對象 dstPos:copy到目標的起始位置 length:copy的長度
arraycopy()是System提供一個native靜態方法,用於數組之間的復制。根據數據中數據類型的不同進行不同的處理,分為值拷貝(基本類型)和對象拷貝(普通類型,即對象類型)
該方法針對數據類型為基本類型的一維數組進行的是深復制;而二維數組或數據為引用類型的一維數據來說,進行的是淺復制。【因二維數組的元素類型是數組類型,而數組類型也是引用類型】
由於上述方法是在JVM中直接執行的,因此其比for循環和clone更加高效。
3、Java中復制數組的幾種方法:
(1)for遍歷
(2)數組clone():
int[]a = new int[]{1,2,3}; int[]b = a.clone();
(3)System.arraycopy()
(4)Arrays.copyof():源碼中,實際最終調用的還是System.arraycopy()。
4、補充:
若自定義一個類,想調用Object的super.clone()方法,則該類必須實現Cloneable接口。
// Object.java源碼如下: protected Object clone() throws CloneNotSupportedException { if (!(this instanceof Cloneable)) { //非Cloneable實例,拋出異常 throw new CloneNotSupportedException("Class " + getClass().getName() + " doesn't implement Cloneable"); } return internalClone(); //native方法 } private native Object internalClone();
5、Java設計模式中的"原型模式"會用到上述clone()。