说道数组的复制,最常用的应该就是弄个循环挨个赋值,或是直接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