System.arraycopy()是Java系统提供的用于数组复制的函数。了解该函数前,先了解以下概念。
1、Java中的深复制和浅复制:
深复制:可以复制对象的内容和引用。例如:值拷贝。
浅复制:仅复制对象的引用。例如:对象拷贝(拷贝的是地址)。
2、函数原型:
public static native void arraycopy(Object src, intsrcPos,
Object dst,int dstPos, intlength);
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() throwsCloneNotSupportedException {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()。