四种方法
System.arraycopy()
这是一个native的方法,也是对大数组最高效的方法。
Arrays.copyOf()
源码如下:
public static <T> T[] copyOf(T[] original, int newLength) {
return copyOf(original, newLength, original.getClass());
}
效率基本上一直都比System.arraycopy()差。
arrayObj.clone()
数组的clone()看不到,不过还是存在clone()的,效果还行吧。
for循环为数组逐一赋值
这个在小数据量级别既简单又快速,数据量大以后就很慢了。
如何做效率测试
为什么用String类型的"orzorzorzorz"呢?
因为太小的数组单元占用空间太少,复制太简单;太大还容易爆空间,所以就用这个挺好。
为什么开10_000_000大小的数组呢?
首先声明,10_000_000
这个写法,其实是为了防止位数太多,看不清楚而有的写法,是符合Java语法规范的。
在一个是需要多次使用,使用一个final修饰的常量能更方便调整数组大小且保持统一。
10M,也就是1000W,应该算比较大的数组了。我们在不开大虚拟机空间的情况下,1000W已经很大了。开到100W不明显;开到1亿就内存爆炸了。
所以随便开个1000W的数组吧!
clone()是深拷贝吗
对于一维数组,确实能做到深拷贝!
完整代码
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
其实这个结果不唯一啊,我有几次测试竟然是方法三更快,这个还算比较正常的,嗯。
四种方法的效率总结
- 原始数组长度不管是多少的时候,Arrays.copyOf()的效率都比System.arraycopy()差,tcl。
- 原始数组长度比较小的时候,千以内的范围中,for循环表现十分优异,并随着数组长度的增加,效率越来越低,因此,for循环适合于小型数组,而且用着真简单。
- 原始数组长度中等的时候,万以内的范围内,两个native方法的效率差不多。
- 原始数组长度比较大的时候,几万、几十万+乃至更多,这时候native方法System.arraycopy()的优势体现出来了,效率拔群。
- 较大数据量的时候四种方法按照效率降序排列:
- No.1: System.arraycopy()
- No.2: Arrays.copyOf()
- No.3: arrayObj.clone()
- No.4: for循环为数组逐一赋值