分享

System.arraycopy详解

 苦修茶馆 2015-04-01

说道数组的复制,最常用的应该就是弄个循环挨个赋值,或是直接clone了。但其实还有System.arraycopy这样的方法,并且速度更快。

多说无用,直接代码测试一下~

int size = 10000;

int[] res = new int[size];

int[] to = new int[size];

long t = System.nanoTime();

for (int i = 0; i < size; i++) {

to[i] = res[i];

}

t = System.nanoTime()-t;

System.out.println("for:"+t);

t = System.nanoTime();

to = res.clone();

t = System.nanoTime()-t;

System.out.println("clone:"+t);

t = System.nanoTime();

System.arraycopy(res, 0, to, 0, size);

t = System.nanoTime()-t;

System.out.println("sys copy:"+t);

输出结果:

for:147630

clone:30789

sys copy:7894

结论:System.arraycopy明显快于其余2中方法,并且clone要快于for。

下面用10w、100w、1000w再测一遍:

10w:

for:1895112

clone:220261

sys copy:72236

100w:

for:7529924

clone:2160373

sys copy:1111962

1000w:

for:18103632

clone:21056234

sys copy:11426726

结论:size在达到1000w的时候,clone耗费的时间比for还要长,而System.arraycopy明显都比其他2中方法要快。


但这只是在size很大的情况下,接下来我用10、100、1000又测了一下,又发现了有趣的现象:

10:

for:395

clone:4737

sys copy:2763

100:

for:1579

clone:8684

sys copy:5526

1000:

for:14211

clone:10658

sys copy:5527

结论:可以看到,在size为10、100的时候for循环快的飞起~而在size到了1000后System.arraycopy才明显快了些。


总结:在数组的size很大的时候,考虑使用System.arraycopy来提高效率,而在size比较小的时候,可以直接使用for循环。但由于nanoTime获取的是纳秒级别的,一纳秒相当于一秒的10亿分之一,所以在虽然在10、100的时候for更快,但也只快了0.0025、0.004毫秒,没错是“毫秒”!这几乎可以忽略不计了~相较之下在10w、100w、1000w下相差了1、6、7毫秒,这虽然对我们人类来说也是没啥区别,但对于计算器来说还是有些差别的。

所以综上所述,建议使用System.arraycopy,并且System.arraycopy还可以选择性的copy数组,这里我就不多说了,直接看下面的代码跟运行的结果就懂了~~

int[] res = new int[]{0,1,2,3,4};

int[] to = new int[]{5,6,7,8,9};

ss(res);

ss(to);

System.arraycopy(res, 0, to, 0, 5);

System.out.println("--copy整个数组");

ss(to);

System.arraycopy(res, 1, to, 2, 3);

System.out.println("--copy 源数组1开始3个数 到to的2开始3个数");

ss(to);

int[] to2 = new int[]{6,6,6,6,6,6,6,6,6,6};

System.arraycopy(res, 0, to2, 1, 5);

System.out.println("--copy源数组到不同长度的数组的1开始5个数");

ss(to2);

//注:ss是将数组打印出来的方法。

运行结果:

0 1 2 3 4 

5 6 7 8 9 

--copy整个数组

0 1 2 3 4 

--copy 源数组1开始3个数 到to的2开始3个数

0 1 1 2 3 

--copy源数组到不同长度的数组的1开始5个数

6 0 1 2 3 4 6 6 6 6 



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多