如何在Java中使用增强for循环_Java遍历集合语法说明

发布时间 - 2026-01-30 00:00:00    点击率:
增强for循环仅适用于Iterable集合或数组,语法为for (Type e : coll),不可修改集合结构,否则抛ConcurrentModificationException;需索引或删除时应选普通for或显式Iterator。

增强for循环的语法结构和适用范围

Java增强for循环(for-each)本质是编译器语法糖,底层仍调用Iterator或数组索引访问。它**只能用于实现了Iterable接口的集合类(如ArrayListHashSet)或数组**,不能用于普通对象或未实现该接口的自定义容器。

基本写法:

for (Type element : collectionOrArray) { ... }

  • Type必须与集合/数组元素类型兼容,否则编译报错Incompatible types
  • 遍历过程中无法获取当前索引,也不能在循环体内修改集合结构(如remove()),否则抛ConcurrentModificationException
  • 对数组使用时,不支持反向遍历或跳步,且无法区分是原始数组还是包装后的List

常见错误:修改集合导致ConcurrentModificationException

增强for循环隐式使用迭代器,但不暴露Iterator.remove()方法。直接在循环中调用list.remove()map.remove()会触发快速失败机制。

正确做法是改用显式Iterator

Iterator it = list.iterator();
while (it.hasNext()) {
    String s = it.next();
    if (s.startsWith("A")) {
        it.remove(); // 安全删除
    }
}
  • 不要写for (String s : list) { if (...) list.remove(s); } —— 这几乎必崩
  • 若只需过滤,优先用Collection.removeIf()(Java 8+):list.removeIf(s -> s.startsWith("A"))
  • Map遍历时想删键值对,必须遍历entrySet()并用Iterator.remove(),不能遍历keySet(

    )
    后调map.remove(key)

增强for vs 普通for:什么时候该选哪个

增强for简洁安全,但能力有限;普通for(含索引或Iterator)更灵活,代价是代码略长。

  • 需要索引(如“第几个元素”“前后元素比较”)→ 必须用普通for (int i = 0; i
  • 遍历ArrayList且需随机访问 → 普通for性能略优(避免每次调iterator().next()
  • 遍历LinkedListHashSet → 增强for更合理(内部仍是迭代器,且避免了get(i)的O(n)开销)
  • 仅读取、无修改、无需索引 → 增强for语义清晰,首选

泛型擦除下容易忽略的类型陷阱

增强for的Type声明受泛型擦除影响,运行时无法校验。如果集合实际装了错误类型,会在循环体第一行赋值时抛ClassCastException

ArrayList rawList = new ArrayList();
rawList.add("hello");
rawList.add(123);
// 编译通过,但运行时在第二次迭代时崩溃
for (String s : rawList) {
    System.out.println(s.length()); // 第一次OK,第二次抛异常
}
  • 永远用带泛型的集合声明:ArrayList list = new ArrayList();
  • 避免混用原始类型(raw type)和泛型,尤其在跨模块传参时
  • 若必须处理未知类型集合,增强for前先做instanceof检查,或改用Object接收再转型
增强for不是万能遍历开关,它的边界很清晰:只读、顺序、无索引需求。一旦涉及删除、索引、并发或类型不确定,就得退回到传统方式——这点在重构旧代码时最容易被忽略。


# java  # 键值对  # String  # Object  # if  # for  # int  # 循环  # 接口  # Collection  # 泛型  # map  # 并发  # 对象  # 重构  # 遍历  # 迭代  # 擦除  # 几个  # 也不  # 什么时候  # 只需  # 适用于  # 会在  # 能在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  如何在建站之星绑定自定义域名?  独立制作一个网站多少钱,建立网站需要花多少钱?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何用景安虚拟主机手机版绑定域名建站?  非常酷的网站设计制作软件,酷培ai教育官方网站?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  用yum安装MySQLdb模块的步骤方法  无锡营销型网站制作公司,无锡网选车牌流程?  香港网站服务器数量如何影响SEO优化效果?  微信小程序 wx.uploadFile无法上传解决办法  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  JavaScript如何实现路由_前端路由原理是什么  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  Laravel如何实现多对多模型关联?(Eloquent教程)  如何自定义建站之星模板颜色并下载新样式?  如何在阿里云部署织梦网站?  LinuxShell函数封装方法_脚本复用设计思路【教程】  如何在香港免费服务器上快速搭建网站?  如何在新浪SAE免费搭建个人博客?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何在服务器上配置二级域名建站?  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  b2c电商网站制作流程,b2c水平综合的电商平台?  如何确保西部建站助手FTP传输的安全性?  Laravel中的Facade(门面)到底是什么原理  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  Laravel怎么清理缓存_Laravel optimize clear命令详解  C++时间戳转换成日期时间的步骤和示例代码  打造顶配客厅影院,这份100寸电视推荐名单请查收  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  使用Dockerfile构建java web环境  JavaScript如何实现倒计时_时间函数如何精确控制  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  如何快速查询域名建站关键信息?  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  敲碗10年!Mac系列传将迎来「触控与联网」双革新  canvas 画布在主流浏览器中的尺寸限制详细介绍  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程  javascript中闭包概念与用法深入理解  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何在云服务器上快速搭建个人网站?