总结Java数组拷贝的四种方法

四种方法

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循环为数组逐一赋值

这个在小数据量级别既简单又快速,数据量大以后就很慢了。

如何做效率测试

荐读:获取Java代码段运行毫秒数的策略

为什么用String类型的"orzorzorzorz"呢?

因为太小的数组单元占用空间太少,复制太简单;太大还容易爆空间,所以就用这个挺好。

为什么开10_000_000大小的数组呢?

首先声明,10_000_000这个写法,其实是为了防止位数太多,看不清楚而有的写法,是符合Java语法规范的。

在一个是需要多次使用,使用一个final修饰的常量能更方便调整数组大小且保持统一。

10M,也就是1000W,应该算比较大的数组了。我们在不开大虚拟机空间的情况下,1000W已经很大了。开到100W不明显;开到1亿就内存爆炸了。

所以随便开个1000W的数组吧!

clone()是深拷贝吗

荐读:总结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

其实这个结果不唯一啊,我有几次测试竟然是方法三更快,这个还算比较正常的,嗯。

四种方法的效率总结

  • 原始数组长度不管是多少的时候,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循环为数组逐一赋值

你可能感兴趣的:(#,Java-BasicTypes,#,Java-Foundation)