日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

for-forEach-stream.forEach三种遍历方法

發(fā)布時間:2024/9/20 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 for-forEach-stream.forEach三种遍历方法 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java8新出的循環(huán)方式,在網(wǎng)上有大量的道友說用流的方式效率反而更低了。

大量的結(jié)論表明,這種方式只是語法糖(for-forEach-stream三種遍歷方法執(zhí)行效率比較與選用思考 - ZZY1078689276的專欄 - CSDN博客
https://blog.csdn.net/ZZY1078689276/article/details/79430772)這篇文章一樣的內(nèi)容看了不止一次,我都不知道誰先寫的。。

不過,耳聽為虛,眼見為實(shí),上代碼親自試驗(yàn):

?public static void main(String[] args) {
? ? // 測試源
? ? List<String> sourceList = new ArrayList<>();
? ? for (int i = 0;i<10;i++) {
? ? ? ? sourceList.add("第" + i + "條數(shù)據(jù)");
? ? }
? ? System.out.println("數(shù)據(jù)條數(shù):" + sourceList.size());
? ? long a1=System.currentTimeMillis();
? ? for (int i = 0;i < sourceList.size();i++) doSome();
? ? long a2=System.currentTimeMillis();
? ? System.out.println("普通for循環(huán)用時:" + (a2-a1));
? ? long b1=System.currentTimeMillis();
? ? for (String t:sourceList) doSome();
? ? long b2=System.currentTimeMillis();
? ? System.out.println("增強(qiáng)for循環(huán)用時:" + (b2-b1));
? ? long c1=System.currentTimeMillis();
? ? sourceList.forEach((t)-> doSome());
? ? long c2=System.currentTimeMillis();
? ? System.out.println("forEach循環(huán)用時:" + (c2-c1));
?
? ? long d1=System.currentTimeMillis();
? ? sourceList.parallelStream().forEach((t)-> doSome());
? ? long d2=System.currentTimeMillis();
? ? System.out.println("forEach-Stream循環(huán)用時:" + (d2-d1));
}
結(jié)果如下:

數(shù)據(jù)條數(shù):10
普通for循環(huán)用時:0
增強(qiáng)for循環(huán)用時:0
forEach循環(huán)用時:43
forEach-Stream循環(huán)用時:6?

好吧,數(shù)據(jù)少了點(diǎn),不過結(jié)果也很明顯了,使用forEach循環(huán)耗時最多,流啟動也很耗時。

不過,讓我們把循環(huán)次數(shù)提升至100W如何?

數(shù)據(jù)條數(shù):1000000
普通for循環(huán)用時:3
增強(qiáng)for循環(huán)用時:10
forEach循環(huán)用時:46
forEach-Stream循環(huán)用時:33

forEach-Stream方式用時增加了,不過forEach用時并沒有明顯增加,再來一次:

數(shù)據(jù)條數(shù):1000000
普通for循環(huán)用時:3
增強(qiáng)for循環(huán)用時:7
forEach循環(huán)用時:38
forEach-Stream循環(huán)用時:31

exm?forEach循環(huán)用時反而減少了是什么情況?不過今天我不研究原理,只看結(jié)論的話,for循環(huán)和增強(qiáng)for循環(huán)至少還是比新出的forEach-Stream要強(qiáng)很多的。

但這么一來,難道新功能真的只是語法糖么?

有人問我doSome()做了什么?實(shí)際上我什么都沒做,但如果我真的做了什么呢?

比如等待一毫秒?

?private static void doSome() {
? ? try {
? ? ? ? Thread.sleep(1);
? ? } catch (Exception e) {
? ? ? ? e.printStackTrace();
? ? }
}
再來一次:

?數(shù)據(jù)條數(shù):10000
普通for循環(huán)用時:10025
增強(qiáng)for循環(huán)用時:10009
forEach循環(huán)用時:10067
forEach-Stream循環(huán)用時:1567

Duang!!!!!!!

forEach-Stream的效率獲得了碾壓式的勝利!有人說是因?yàn)閖vm預(yù)熱原因,但先且不論預(yù)熱的是什么(通常是指啟動時加載的東西),預(yù)熱這種一次性的行為怎么可能取得這么大的提升?

于是,讓我們打印一下doSome()的線程

ForkJoinPool.commonPool-worker-5
ForkJoinPool.commonPool-worker-4
ForkJoinPool.commonPool-worker-6
ForkJoinPool.commonPool-worker-2
main
ForkJoinPool.commonPool-worker-3
ForkJoinPool.commonPool-worker-7
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-6
main
ForkJoinPool.commonPool-worker-2
ForkJoinPool.commonPool-worker-3
ForkJoinPool.commonPool-worker-4
ForkJoinPool.commonPool-worker-5
ForkJoinPool.commonPool-worker-7
ForkJoinPool.commonPool-worker-1
ForkJoinPool.commonPool-worker-5
main

stream().forEach用的多線程方式,其調(diào)用線程池的時候必然會耗費(fèi)更多的時間。但如果你在循環(huán)內(nèi)要處理的事情很多,或者要循環(huán)調(diào)用遠(yuǎn)程接口/數(shù)據(jù)庫的時候,無疑極大的提升了效率

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的for-forEach-stream.forEach三种遍历方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。