数组的复制,有四种方法:
- for
- clone
- System.arraycopy
- arrays.copyof
均是浅拷贝
1、for
//源数组
int[] source = {10,30,20,40};
//目标数组
int[] target = new int[source.length];
for (int i = 0;i < source.length;i++){
target[i] = source[i];
}
2、clone
protected native Object clone() throws CloneNotSupportedException;
int[] source = {1,2,3,4,5,6};
int[] target = new int[6];
target = source.clone();
克隆方法我们在数组中是找不到的,它是object的方法,我们先看看源码
看到了修饰符native,说明是由c或者c++实现的,它的优点是速度快,它返回了object对象,所以使用的时候需要用对象接收返回值。
3、System.arraycopy
// src –源数组。
// srcPos –源数组中的起始位置。
// dest –目标数组。
// destPos –目标数据中的起始位置。
// length –要复制的数组元素的数量。
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
int[] source = {1,2,3,4,5,6};
int[] target = new int[6];
System.arraycopy(source, 0, target, 0, source.length);
是否线程安全
System.arraycopy是不安全的。
是否高效 for vs System.arraycopy 复制数组
当测试数组的范围比较小的时候,两者相差的时间无几,当测试数组的长度达到百万级别,System.arraycopy的速度优势就开始体现了,根据对底层的理解,System.arraycopy是对内存直接进行复制,减少了for循环过程中的寻址时间,从而提高了效能。
4、Arrays.copyOf
// original –要复制的数组
// newLength –要返回的副本的长度
// 返回值:原始数组的副本,被截断或填充零以获取指定的长度
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
int[] source = {1,2,3,4,5,6};
int[] target = Arrays.copyOf(source, source.length);
参考链接
Arrays.copyOf() 底层使用的还是 System.arraycopy()
System:System.arraycopy方法详解
java数组的四种拷贝方式