深入了解java8的foreach循环
发布时间 - 2026-01-11 01:31:11 点击率:次虽然java8出来很久了,但是之前用的一直也不多,最近正好学习了java8,推荐一本书还是不错的<写给大忙人看的javase8>。因为学习了Java8,所以只要能用到的地方都会去用,尤其是Java8的Stream,感觉用起来觉得很方便,因为点点点就出来了,而且代码那么简洁。现在开始慢慢深入了解java8,发现很多东西不能看表面。

比如常规遍历一个集合,下面给出例子:
1.首先遍历一个List
方式1.一开始是这样的:
public static void test1(List<String> list) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
方式2.当然稍微高级一点的是这样:
public static void test2(List<String> list) {
for (int i = 0,lengh=list.size(); i < lengh; i++) {
System.out.println(list.get(i));
}
}
方式3.还有就是Iterator遍历:
public static void test3(List<String> list) {
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
方式4.后来有了增强for循环:
public static void test4(List<String> list) {
for(String str:list){
System.out.println(str);
}
}
方式5.java8以后新增的方式:
public static void test5(List<String> list) {
//list.forEach(System.out::println);和下面的写法等价
list.forEach(str->{
System.out.println(str);
});
}
方式6.还有另一种:
public static void test6(List<String> list) {
list.iterator().forEachRemaining(str->{
System.out.println(str);
});
}
应该没有其他的了吧,上面六中方法,按我的使用习惯5最常用,4偶尔使用,其他的基本就不怎么用了,使用5的原因是因为方便书写,提示就可以写出来,偶尔使用4的原因是,5不方便计数用,下面进行性能测试,String不具备代表性,决定使用对象,简单的一个测试类如下:
一个简单的测试,内容不要太在意,简单计算hashCode:
package test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test8 {
public static void main(String[] args) {
List<Dog> list=new ArrayList<>();
for(int i=0;i<10;i++){
list.add(new Dog(i,"dog"+i));
}
long nanoTime = System.nanoTime();
test1(list);
long nanoTime1 = System.nanoTime();
test2(list);
long nanoTime2 = System.nanoTime();
test3(list);
long nanoTime3 = System.nanoTime();
test4(list);
long nanoTime4 = System.nanoTime();
test5(list);
long nanoTime5 = System.nanoTime();
test6(list);
long nanoTime6 = System.nanoTime();
System.out.println((nanoTime1-nanoTime)/1000000.0);
System.out.println((nanoTime2-nanoTime1)/1000000.0);
System.out.println((nanoTime3-nanoTime2)/1000000.0);
System.out.println((nanoTime4-nanoTime3)/1000000.0);
System.out.println((nanoTime5-nanoTime4)/1000000.0);
System.out.println((nanoTime6-nanoTime5)/1000000.0);
}
public static void test1(List<Dog> list) {
for (int i = 0; i < list.size(); i++) {
list.get(i).hashCode();
}
}
public static void test2(List<Dog> list) {
for (int i = 0,lengh=list.size(); i < lengh; i++) {
list.get(i).hashCode();
}
}
public static void test3(List<Dog> list) {
Iterator<Dog> iterator = list.iterator();
while(iterator.hasNext()){
iterator.next().hashCode();
}
}
public static void test4(List<Dog> list) {
for(Dog dog:list){
dog.hashCode();
}
}
public static void test5(List<Dog> list) {
//list.forEach(System.out::println);和下面的写法等价
list.forEach(dog->{
dog.hashCode();
});
}
public static void test6(List<Dog> list) {
list.iterator().forEachRemaining(dog->{
dog.hashCode();
});
}
}
class Dog{
private int age;
private String name;
public Dog(int age, String name) {
super();
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Dog [age=" + age + ", name=" + name + "]";
}
}
运行三次取平均值,机器配置就不说了,因为我不是比较的绝对值,我是比较的这几种方式的相对值,数据结果,趋势图如下:
然后去掉表现一直很稳定的方式5和百万级数据量以上的数据,来分析结果:
可以得出一个非常吓人的结果,java8的foreach每次循环的耗时竟然高达100毫秒以上,虽然它比较稳定(算是优点吧)。所以得出以下结论:
在正常使用(数据量少于百万以下),正常(非并行)遍历一个集合的时候:
•不要使用java8的foreach,每次耗时高达100毫秒以上
•提前计算出大小的普通for循环,耗时最小,但是书写麻烦
•增强for循环表现良好
2.再次遍历一个Set
使用以相同的方式测试HashSet,测试方法如下:
package test;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Test9 {
public static void main(String[] args) {
Set<Dog> set = new HashSet<>();
for (int i = 0; i < 10_000_000; i++) {
set.add(new Dog(i, "dog" + i));
}
long nanoTime = System.nanoTime();
test1(set);
long nanoTime1 = System.nanoTime();
test2(set);
long nanoTime2 = System.nanoTime();
test3(set);
long nanoTime3 = System.nanoTime();
test4(set);
long nanoTime4 = System.nanoTime();
System.out.println((nanoTime1 - nanoTime) / 1000000.0);
System.out.println((nanoTime2 - nanoTime1) / 1000000.0);
System.out.println((nanoTime3 - nanoTime2) / 1000000.0);
System.out.println((nanoTime4 - nanoTime3) / 1000000.0);
}
public static void test1(Set<Dog> list) {
Iterator<Dog> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.next().hashCode();
}
}
public static void test2(Set<Dog> list) {
for (Dog dog : list) {
dog.hashCode();
}
}
public static void test3(Set<Dog> list) {
list.forEach(dog -> {
dog.hashCode();
});
}
public static void test4(Set<Dog> list) {
list.iterator().forEachRemaining(dog -> {
dog.hashCode();
});
}
}
经过计算得出如下结果:
不难发现,java8的foreach依然每次耗时100ms以上,最快的变成了增强for循环,Iterator遍历和java8的iterator().forEachRemaining差不多。
3.最后遍历Map
依然使用相同的方式测试Map集合遍历,测试类如下:
package test;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class Test10 {
public static void main(String[] args) {
Map<String, Dog> map = new HashMap<>();
for (int i = 0; i < 1000_000; i++) {
map.put("dog" + i, new Dog(i, "dog" + i));
}
long nanoTime = System.nanoTime();
test1(map);
long nanoTime1 = System.nanoTime();
test2(map);
long nanoTime2 = System.nanoTime();
test3(map);
long nanoTime3 = System.nanoTime();
test4(map);
long nanoTime4 = System.nanoTime();
System.out.println((nanoTime1 - nanoTime) / 1000000.0);
System.out.println((nanoTime2 - nanoTime1) / 1000000.0);
System.out.println((nanoTime3 - nanoTime2) / 1000000.0);
System.out.println((nanoTime4 - nanoTime3) / 1000000.0);
}
public static void test1(Map<String, Dog> map) {
Iterator<Map.Entry<String, Dog>> entries = map.entrySet().iterator();
while (entries.hasNext()) {
Map.Entry<String, Dog> entry = entries.next();
int code=entry.getKey().hashCode()+entry.getValue().hashCode();
}
}
public static void test2(Map<String, Dog> map) {
for (Map.Entry<String, Dog> entry : map.entrySet()) {
int code=entry.getKey().hashCode()+entry.getValue().hashCode();
}
}
public static void test3(Map<String, Dog> map) {
for (String key : map.keySet()) {
int code=key.hashCode()+map.get(key).hashCode();
}
}
public static void test4(Map<String, Dog> map) {
map.forEach((key, value) -> {
int code=key.hashCode()+value.hashCode();
});
}
}
结果如下:
java8的foreach依然不负众望,最快的是增强for循环。
最终结论
普通(数量级10W以下,非并行)遍历一个集合(List、Set、Map)如果在意效率,不要使用java8的foreach,虽然它很方便很优雅
任何时候使用增强for循环是你不二的选择
以上所述是小编给大家介绍的java8的foreach循环 ,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
# java
# foreach循环
# Java for循环的几种用法分析
# Java中的两种for循环介绍
# java使用for循环输出杨辉三角
# 深入理解java中for和foreach循环
# 浅析java的foreach循环
# java跳出for循环的三种常见方法
# Java双重for循环的优化示例
# 遍历
# 的是
# 就不
# 其他的
# 小编
# 我是
# 是因为
# 尤其是
# 是这样
# 说了
# 不多
# 不负众望
# 你不
# 用了
# 给大家
# 几种
# 正常使用
# 能看
# 人看
# 一本书
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
linux top下的 minerd 木马清除方法
中山网站推广排名,中山信息港登录入口?
Laravel如何实现用户密码重置功能?(完整流程代码)
零基础网站服务器架设实战:轻量应用与域名解析配置指南
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
详解Oracle修改字段类型方法总结
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复
Android Socket接口实现即时通讯实例代码
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
网站制作大概多少钱一个,做一个平台网站大概多少钱?
活动邀请函制作网站有哪些,活动邀请函文案?
如何在服务器上配置二级域名建站?
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
Android自定义listview布局实现上拉加载下拉刷新功能
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
如何制作一个表白网站视频,关于勇敢表白的小标题?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
高防服务器:AI智能防御DDoS攻击与数据安全保障
高性能网站服务器部署指南:稳定运行与安全配置优化方案
如何为不同团队 ID 动态生成多个非值班状态按钮
清除minerd进程的简单方法
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
Java解压缩zip - 解压缩多个文件或文件夹实例
android nfc常用标签读取总结
Internet Explorer官网直接进入 IE浏览器在线体验版网址
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】
Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)
Laravel如何编写单元测试和功能测试?(PHPUnit示例)
详解Android图表 MPAndroidChart折线图
Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试
Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
米侠浏览器网页背景异常怎么办 米侠显示修复
详解jQuery中的事件
车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?
Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件
Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程
网站制作免费,什么网站能看正片电影?
python中快速进行多个字符替换的方法小结
如何快速打造个性化非模板自助建站?

