这是一个native的方法,也是对大数组最高效的方法。
源码如下:
public static <T> T[] copyOf(T[] original, int newLength) {
return copyOf(original, newLength, original.getClass());
}
效率基本上一直都比System.arraycopy()差。
数组的clone()看不到,不过还是存在clone()的,效果还行吧。
这个在小数据量级别既简单又快速,数据量大以后就很慢了。
荐读:获取Java代码段运行毫秒数的策略
因为太小的数组单元占用空间太少,复制太简单;太大还容易爆空间,所以就用这个挺好。
首先声明,10_000_000
这个写法,其实是为了防止位数太多,看不清楚而有的写法,是符合Java语法规范的。
在一个是需要多次使用,使用一个final修饰的常量能更方便调整数组大小且保持统一。
10M,也就是1000W,应该算比较大的数组了。我们在不开大虚拟机空间的情况下,1000W已经很大了。开到100W不明显;开到1亿就内存爆炸了。
所以随便开个1000W的数组吧!
荐读:总结Java数组的拷贝和输出
对于一维数组,确实能做到深拷贝!
import java.util.Arrays;
public class ArrayCopyTest {
public static void main(String[] args) {
final int LIMIT = 10_000_000;
String[] array0 = new String[LIMIT];
Arrays.fill(array0, "orzorzorzorz");
String[] array = new String[LIMIT];
long time1 = System.currentTimeMillis();
System.arraycopy(array0, 0, array, 0, LIMIT);
long time2 = System.currentTimeMillis();
array = Arrays.copyOf(array0, LIMIT);
long time3 = System.currentTimeMillis();
array = array0.clone();
long time4 = System.currentTimeMillis();
for (int i = 0; i < LIMIT; i++) {
array[i] = array0[i];
}
long time5 = System.currentTimeMillis();
System.out.println("方法一耗时:" + (time2-time1));
System.out.println("方法二耗时:" + (time3-time2));
System.out.println("方法三耗时:" + (time4-time3));
System.out.println("方法四耗时:" + (time5-time4));
}
}
方法一耗时:15
方法二耗时:47
方法三耗时:48
方法四耗时:78
其实这个结果不唯一啊,我有几次测试竟然是方法三更快,这个还算比较正常的,嗯。