for、foreach、stream 哪家的效率更高,你真的用对了吗?
昨天在《SQL中那么多函数,Java8为什么还要提供重复的Stream方法,多此一举?》一文中,有同学指出Stream在数据量不庞大的情况,效率不如for循环。
这个就触及到我的知识盲区了,今天赶紧测试了一下,以下是正文,有问题欢迎大家指出,一起学习!
比较for循环、foreach循环及Stream方法效率
for循环
首先,10000数据的for循环,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class ForTest { public static void main(String[] args) { Long startTime = System.currentTimeMillis(); formMethod(); Long endTime = System.currentTimeMillis(); System.out.println( "time_total:" + (endTime - startTime)); } public static void formMethod(){ for ( int i = 0 ; i < 10000 ; i++) { System.out.println( "__________for循环____________" ); } } } |
测试结果:
运行多次,时间基本落在100内,90左右。
foreach循环
同样数据量,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class ForTest { public static void main(String[] args) { List<Integer> lists = new ArrayList<>(); for ( int i = 0 ; i < 10000 ; i++) { lists.add(i); } Long startTime = System.currentTimeMillis(); formMethod(lists); Long endTime = System.currentTimeMillis(); System.out.println( "time_total:" + (endTime - startTime)); } public static void formMethod(List<Integer> lists){ lists.forEach(i->{ System.out.println( "__________forEach____________" ); }); } } |
测试结果:
运行多次,时间基本落在150左右。额,这个增强型效果不如for循环~
Stream
同样数据量,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class ForTest { public static void main(String[] args) { List<Integer> lists = new ArrayList<>(); for ( int i = 0 ; i < 10000 ; i++) { lists.add(i); } Long startTime = System.currentTimeMillis(); formMethod(lists); Long endTime = System.currentTimeMillis(); System.out.println( "time_total:" + (endTime - startTime)); } public static void formMethod(List<Integer> lists){ lists.stream().forEach(i->{ System.out.println( "__________stream处理____________" ); }); } } |
测试结果:
基本和增强型for循环效率差别不大。
得出结论:
★
1万以内的数据,for循环的性能要高于foreach和stream;
”
昨天那位同学说的没毛病!!!
数据加到1000万,代码不变,看结果:
for循环
时间落在43240附近。
foreach循环
基本和for循环效率差别不大。
Stream
基本和for循环,增强型for循环效率差别不大。
Stream的优势在于,提供了并行处理(parallelStream()方法),即stream api提供了异步处理机制,可以充分利用CPU核数,大大提升效率!因为机器配置原因,没有给出并行处理下的结果截图~~
得出结论:
★
数据量上去之后,测试三种遍历方式,基本已经没有什么差距了,但是Stream提供并行处理,在数据量大了之后,效率会明显增强。(但是单核CPU,Stream并行处理可能会效率更慢)
”
下次用什么来做遍历操作,你清楚了吗?
《《--扫描二维码关注他!
【Java知音】公众号,每天早上8:30为您准时推送一篇技术文章
在Java知音公众号内回复“面试题聚合”,送你一份Java面试题宝典。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步