优点:该方法可复制全部内容,也可复制一部分成为子数组,且目标数组与源数组没有关系,目标数组可以比源数组大,比较灵活。
缺点:返回值为void,所以需要手动创建目标数组。
/**
*参数含义
* @param src 源数组(需要复制的数组)
* @param srcPos 源数组中的起始下标。!注意是下标!
* @param dest 目标数组(最后需要的数组)
* @param destPos 目标数据中的起始位置
* @param length 要复制的数组元素的长度。
*/
public static native void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length);
简单使用:
public static void main(String[] args) {
int[] srcArray = {0,1,2,3,4,5,6,7,8,9};
int[] destArray = new int[5];
System.arraycopy(srcArray,2,destArray,0,5);
for (int i : destArray) {
System.out.print(i+" ");
}
}
//结果:2 3 4 5 6
注意点:
1、不管是源数组还是目标数组,设置起始下标和长度时要准确,不要超过数组本身长度,使用不当会报
IndexOutOfBoundsException
异常。2、源数组与目标数组要同类型,不能一个Int一个long或者其他的,使用不当会报
ArrayStoreException
异常。3、目标数组和源数组不可为null,为null时报
NullPointerException
异常。
这两个方法底层是调用上述
arraycopy
方法实现。
copyOf
与copyOfRange
的区别:前者是复制全部内容,或者可在范围内自定义长度复制内容。
copyOf
:
/**
* 根据源数组类型选择返回值不同的copyOf方法。
* 第一个参数是源数组。
* 第二个参数是新数组的长度(可大于源数组)。
* 返回值是与源数组同类型的复制好的数组。
*
* 举例返回值为int类型数组 copyOf方法。
*/
public static int[] copyOf(int[] original, int newLength)
copyOf
使用:
public static void main(String[] args) {
int[] srcArray = {0,1,2,3,4,5,6,7,8,9};
int[] destArray = Arrays.copyOf(srcArray,4);
for (int i : destArray) {
System.out.print(i+" ");
}
}
注意点:
1、第二个参数可大于源数组,可为0,但不可为负数。为负数时会报
NegativeArraySizeException
异常。2、源数组要初始化,即不能为null值。
copyOfRange
/**
* 参数含义
* @param original 源数组
* @param from 要复制范围的初始下标。(包含在内)
* @param to 要复制范围的最终下标(不包含在内)
* 返回值为与源数组一致。
* 举例返回值为int类型数组 copyOfRange方法。
*/
public static int[] copyOfRange(int[] original, int from, int to)
copyOfRange
的使用
public static void main(String[] args) {
int[] srcArray = {0,1,2,3,4,5,6,7,8,9};
int[] destArray = Arrays.copyOfRange(srcArray,1,5);
for (int i : destArray) {
System.out.print(i+" ");
}
}
注意点:
1、
copyOfRange
方法中from和to参数是含左不含右,即左必右开[)。2、参数from一定要小于等于参数to,不能大于参数to,否则会报
IllegalArgumentException
异常。3、参数from一定要不能小于0,且不能大于源数组的最大下标。否则会报
ArrayIndexOutOfBoundsException
异常。4、源数组要初始化,即不能为null值。
使用:
public static void main(String[] args) {
int[] srcArray = {0,1,2,3,4,5,6,7,8,9};
int[] destArray = srcArray.clone();
for (int i : destArray) {
System.out.print(i+" ");
}
}
总结:
1、需要全部复制数组内容使用copyOf
方法和clone
方法更简单。(另外两种也能实现)
2、需要复制一部分数组内容使用arraycopy
和copyOfRange
方法,arraycopy
方法需要提前创建结果数组,copyOfRange
方法返回值为数组类型。