您当前的位置: 首页 >  Java

星拱北辰

暂无认证

  • 1浏览

    0关注

    1205博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Java】数组拷贝的四种方法

星拱北辰 发布时间:2020-03-04 01:34:54 ,浏览量:1

四种方法 System.arraycopy()

这是一个native的方法,也是对大数组最高效的方法。

Arrays.copyOf()

源码如下:

public static  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             
关注
打赏
1660750074
查看更多评论
0.0416s