Java小白踩坑录 - for-each & for 循环

简介: Java小白踩坑录 - for-each & for 循环

事情是这样的,早上评审小胖的代码,发现小胖使用的循环代码如下:

privatestaticfinalintbatchsize=1000000;
privatestaticList<String>nums=newArrayList<>();
publicstaticvoidinit(){      
for(inti=0;i<batchsize;i++) {
nums.add(""+i);
    }
}
publicstaticvoidindex() {
intcount=0;
for(inti=0;i<nums.size();i++) {
count++;
    }
System.out.println(count);
}

评审时,小白认为从 JDK 版本 1.5 后,都推荐使用新的 for-each 了,不用老旧的索引或者遍历,毕竟他们都过时了,而且新的 foreach 循环对算法做了优化,性能更优。

publicstaticvoidforeach() {  
intcount=0;
for(Stringstr:nums) {
count++;
    }
System.out.println(count);
}
//淘汰了publicstaticvoiditerator() {
Iterator<String>it=nums.iterator();
intcount=0;
while(it.hasNext()) {
it.next();
count++;
    }
System.out.println(count);
}

这番说法,立刻遭到小胖的针锋相对,小胖给出了三个程序的测评程序,发现 foreach 并没有如传说中的性能优势,反而效率更低了。

三个火枪手 foreach,Iterator,for

测试程序如下:

publicstaticvoidmain(String[] args) {
init();
//foreach遍历测试longstart=System.currentTimeMillis();
foreach();
System.out.println(System.currentTimeMillis()-start);
//迭代器方式测试start=System.currentTimeMillis();
iterator();
System.out.println(System.currentTimeMillis()-start);
//索引方式测试start=System.currentTimeMillis();
index();
System.out.println(System.currentTimeMillis()-start);       
}

测试数据分别为 1w,10w,100w,1kw 四个级别。

数量级 \ 耗时 (毫秒) foreach Iterator index
1w 2 1 0
10w 6 4 3
100w 13 9 5
1kw 52 10

4


小白震惊了,事实胜于雄辩,网上的或者别人说的,都需要验证而不能盲目的接受。

于是虚心下来,好好复习这方面的知识,总结如下:

for-each 循环在简洁性和预防 Bug 方面,有着传统的 for 循环无法比拟的优势,也没有太多的性能损失。应该尽可能的使用 for-each 循环。有三种情况,不适合使用 for-each 循环:

1. 过滤–若需要遍历集合,并删除选定的元素,需要使用显示的迭代器,这样可以调用它的 remove 方法。

2. 转换–若需要遍历列表或者数组,并替换它部分或者全部的元素值,需要列表迭代器或者数组索引,以便设定元素的值。

3. 平行迭代–若需要平行的遍历多个集合,需要显示地控制迭代器或者索引遍历,以便所有的迭代器或者索引遍历可以同步前移。

目录
相关文章
|
4月前
|
Java
Java编程:理解while循环的使用
总结而言, 使用 while 迴圈可以有效解决需要多次重复操作直至特定條件被触发才停止執行任务场景下问题; 它简单、灵活、易于实现各种逻辑控制需求但同时也要注意防止因邏各错误导致無限迁璇発生及及時處理可能発生异常以确保程序稳定运作。
391 0
|
9月前
|
传感器 安全 Java
《从头开始学java,一天一个知识点》之:循环结构:for与while循环的使用场景
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问&quot;`a==b`和`equals()`的区别&quot;,大脑突然空白
267 22
|
11月前
|
Java
Java快速入门之判断与循环
本文介绍了编程中的流程控制语句,主要包括顺序结构、判断结构(if语句和switch语句)以及循环结构(for、while和do...while)。通过这些语句可以精确控制程序的执行流程。if语句有三种格式,分别用于简单条件判断、二选一判断和多条件判断。switch语句适用于有限个离散值的选择判断,而循环结构则用于重复执行某段代码,其中for循环适合已知次数的情况,while循环适合未知次数但有明确结束条件的情况,do...while则是先执行后判断。文中还提供了多个示例和练习,帮助读者理解并掌握这些重要的编程概念。
|
12月前
|
Java
Java之for循环
Java 提供了三种 for 循环方式:fori、foreach 和 Stream.foreach。fori 是最早的循环形式,现已较少使用;foreach 是对 fori 的语法糖,编译时会自动转换;Stream.foreach 结合 lambda 表达式使用,代码更简洁,但不支持 break 和 return。
350 11
Java之for循环
Java之for循环
Java 提供了三种 for 循环方式:fori、foreach 和 Stream.foreach。fori 是最早的形式,现已较少使用;foreach 是对 fori 的语法糖;Stream.foreach 结合 lambda 表达式,代码更简洁,但不支持 break 和 return。
211 0
Java之for循环
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中stream API与传统for循环在性能上的对比,通过多个示例分析了不同场景下两者的优劣。作者指出,尽管stream API使代码更简洁,但不当使用会降低可读性和性能,特别是在处理大数据量时。实验结果显示,在多数情况下,普通for循环的性能优于stream API,尤其是在单次操作耗时较短但需多次执行的场景中。文章建议开发者在设计初期就考虑全局流程,避免重复使用stream流,以提升代码质量和性能。
312 1
Java循环操作哪个快?
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
277 5
Java循环操作哪个快?
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
325 6
|
Java 测试技术 开发者
💡Java 零基础:彻底掌握 for 循环,打造高效程序设计
【10月更文挑战第15天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
386 63