Java中for、foreach、stream區(qū)別和性能比較詳解
性能比較
最終總結(jié):如果數(shù)據(jù)在1萬(wàn)以內(nèi)的話,for循環(huán)效率高于foreach和stream;如果數(shù)據(jù)量在10萬(wàn)的時(shí)候,stream效率最高,其次是foreach,最后是for。另外需要注意的是如果數(shù)據(jù)達(dá)到100萬(wàn)的話,parallelStream異步并行處理效率最高,高于foreach和for。
在效率方面,stream().forEach、forEach 和 parallelStream 之間存在一些差異。
- stream().forEach:
○ 在處理大量數(shù)據(jù)時(shí),使用 stream().forEach 可能會(huì)比普通的 forEach 更高效。這是因?yàn)?stream().forEach 可以使用流式操作,對(duì)數(shù)據(jù)進(jìn)行更優(yōu)化的處理,例如通過(guò)并行流或者其他優(yōu)化手段來(lái)提高處理速度。
○ 但是需要注意的是,stream().forEach 也可能會(huì)引入一些額外的性能開(kāi)銷,比如流的創(chuàng)建和操作過(guò)程中的一些額外計(jì)算。 - forEach:
○ forEach 方法是集合類的默認(rèn)方法,它通常會(huì)按照集合內(nèi)部的數(shù)據(jù)結(jié)構(gòu)進(jìn)行遍歷,不涉及額外的流式操作或并行處理。因此,在某些情況下,forEach 可能會(huì)比 stream().forEach 更加高效。 - parallelStream:
○ parallelStream 方法可以在處理大量數(shù)據(jù)時(shí)提供更高的效率,因?yàn)樗梢岳枚嗪颂幚砥鞑⑿刑幚頂?shù)據(jù)。在某些情況下,特別是對(duì)于需要并行處理的大型數(shù)據(jù)集合,使用 parallelStream 可能會(huì)比順序處理更加高效。
○ 然而,并行處理也可能引入一些額外的開(kāi)銷,比如線程調(diào)度、同步等,因此并不是所有情況下都適合使用 parallelStream。
總的來(lái)說(shuō),對(duì)于數(shù)據(jù)量較小的情況,forEach 和 stream().forEach 的性能差異可能并不明顯;而對(duì)于大型數(shù)據(jù)集合或需要并行處理的情況,考慮使用 parallelStream 可能會(huì)更加高效。在實(shí)際應(yīng)用中,可以根據(jù)具體情況進(jìn)行性能測(cè)試和選擇合適的方法。
區(qū)別
在Java中,forEach 方法是用來(lái)對(duì)集合中的每個(gè)元素執(zhí)行特定操作的方法。stream().forEach 和 forEach 方法都可以使用在集合類上,但是有一些區(qū)別。
- stream().forEach:
○ stream().forEach 是針對(duì) Stream 接口的方法,它通過(guò)創(chuàng)建一個(gè)流(Stream)來(lái)操作集合中的元素。這意味著它可以對(duì)集合進(jìn)行更靈活的操作,比如篩選、映射和過(guò)濾等。
○ 使用 stream().forEach 可以讓操作變得更加函數(shù)式和流暢,可以方便地進(jìn)行各種中間操作和終端操作。 - forEach:
○ forEach 是 Iterable 接口中的默認(rèn)方法,因此幾乎所有的集合類都支持 forEach 方法。
○ forEach 方法是串行執(zhí)行的,即對(duì)集合中的每個(gè)元素依次執(zhí)行指定的操作。這意味著它不能并行處理集合中的元素。 - parallelStream:
○ parallelStream 是 Collection 接口中新增的方法,它可以將集合轉(zhuǎn)換成并行流,從而允許在多個(gè)線程上并行處理集合中的元素。
○ 與普通的 stream() 方法相比,parallelStream 方法可以提高處理大量數(shù)據(jù)時(shí)的效率,因?yàn)樗梢岳枚嗪颂幚砥鞑⑿刑幚頂?shù)據(jù)。
因此,stream().forEach 提供了更多的靈活性和功能性,可以結(jié)合流式操作來(lái)對(duì)集合進(jìn)行處理;而 forEach 和 parallelStream 則是集合類提供的簡(jiǎn)單遍歷和并行處理的方法。
使用方式和行為
stream().forEach() 和 forEach() 在使用方式和行為上有一些區(qū)別。
- stream().forEach():
○ stream().forEach() 是流(Stream)API 的操作,用于對(duì)流中的每個(gè)元素執(zhí)行給定的操作。
○ 它是一個(gè)終端操作,用于觸發(fā)流的遍歷和操作。
○ stream().forEach() 可以接收一個(gè) lambda 表達(dá)式或方法引用作為參數(shù),用于定義要執(zhí)行的操作。
○ 它可以在串行流或并行流上執(zhí)行操作,如果使用并行流,在多線程情況下可以實(shí)現(xiàn)更高的處理效率。
○ stream().forEach() 不保證元素的遍歷順序,可能是無(wú)序的。 - forEach():
○ forEach() 是 Iterable 接口的默認(rèn)方法,用于對(duì)集合中的每個(gè)元素執(zhí)行給定的操作。
○ 它是一個(gè)終端操作,用于觸發(fā)集合的遍歷和操作。
○ forEach() 可以接收一個(gè) lambda 表達(dá)式或方法引用作為參數(shù),用于定義要執(zhí)行的操作。
○ 它在單線程下按照集合的順序依次遍歷元素執(zhí)行操作。
○ forEach() 保證按照集合元素的順序執(zhí)行操作,并且保持了元素的順序性。
總體而言,stream().forEach() 主要用于流的操作,可以進(jìn)行并行處理和無(wú)序遍歷,適用于處理復(fù)雜的數(shù)據(jù)、并行操作和無(wú)序操作的場(chǎng)景。而 forEach() 則主要用于對(duì)集合進(jìn)行遍歷,并且保持了元素的順序性,適用于簡(jiǎn)單的遍歷操作。
fori for (int i = 0; i < objects.size(); i++) {} foreach for (Object o : objects) {} fori最普通的循環(huán),可以時(shí)候得到當(dāng)前的索引位置。 foreach 和fori區(qū)別不大,foreach是普通fori的增強(qiáng)版用起來(lái)更方便。但是沒(méi)有當(dāng)前索引。
1.list的遍歷 方法一:itli 或者fori for (int i = 0; i < list3.size(); i++) { Integer integer = list3.get(i); } 方法二:iter for (Integer integer : list3) { } 方法三:forEach list.forEach(o->{}); 方法四:stream().forEach list.stream() .forEach( o -> { });
總結(jié)
到此這篇關(guān)于Java中for、foreach、stream區(qū)別和性能比較的文章就介紹到這了,更多相關(guān)Java中for、foreach、stream區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
idea springboot 修改css,jsp不重啟實(shí)現(xiàn)頁(yè)面更新的問(wèn)題
這篇文章主要介紹了idea springboot 修改css,jsp不重啟實(shí)現(xiàn)頁(yè)面更新的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10JavaSE實(shí)現(xiàn)電影院系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了JavaSE實(shí)現(xiàn)電影院系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08使用SpringBoot與Thrift實(shí)現(xiàn)RPC通信的方式詳解
在微服務(wù)架構(gòu)的世界里,服務(wù)間的通信機(jī)制選擇成為了關(guān)鍵決策之一,RPC因其簡(jiǎn)潔、高效的特點(diǎn)備受青睞,本文將詳細(xì)探討如何利用Spring?Boot和Thrift框架構(gòu)建RPC通信,讓讀者理解其內(nèi)在原理及實(shí)現(xiàn)方式,需要的朋友可以參考下2023-10-10