System.arraycopy詳解

說道數組的複製,最經常使用的應該就是弄個循環挨個賦值,或是直接clone了。但其實還有System.arraycopy這樣的方法,而且速度更快。數組

多說無用,直接代碼測試一下~測試

int size = 10000;spa

int[] res = new int[size];it

int[] to = new int[size];for循環

long t = System.nanoTime();效率

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

to[i] = res[i];方法

}im

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很大的狀況下,接下來我用十、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爲十、100的時候for循環快的飛起~而在size到了1000後System.arraycopy才明顯快了些。


總結:在數組的size很大的時候,考慮使用System.arraycopy來提升效率,而在size比較小的時候,能夠直接使用for循環。但因爲nanoTime獲取的是納秒級別的,一納秒至關於一秒的10億分之一,因此在雖然在十、100的時候for更快,但也只快了0.002五、0.004毫秒,沒錯是「毫秒」!這幾乎能夠忽略不計了~相較之下在10w、100w、1000w下相差了一、六、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 

相關文章
相關標籤/搜索