增强for循环专注元素遍历,语法统一且安全:数组和iterable集合均可直接使用;java 10+支持var简化类型声明;但禁止边遍历边修改结构,也不支持获取索引或反向遍历。

增强 For 循环(for-each)不是炫技工具,而是让“遍历”这件事回归本意:专注元素本身,不纠缠索引、不手动调用 next()。只要目标是逐个读取、处理、转换元素,它就是最直接、最安全的选择。
遍历数组:类型明确,写法统一
无论 int[]、String[] 还是自定义对象数组,语法完全一致——声明元素类型 + 变量名 + 冒号 + 数组名。
- 基本类型数组:int[] nums = {1, 5, 9}; for (int n : nums) { System.out.println(n * 2); }
- 引用类型数组:String[] tags = {"java", "web", "api"}; for (String tag : tags) { if (tag.length() > 3) System.out.println(tag); }
- 注意:不能直接用增强 for 遍历 String 字符串,需先转为 char[] 或使用 toCharArray()
遍历集合:语义清晰,按需选择视图
List、Set 等实现了 Iterable 接口的集合可直接遍历;Map 本身不支持,但 keySet()、values()、entrySet() 返回的都是 Iterable,选哪个取决于你要操作什么。
- 只关心值:List
prices = Arrays.asList(29.9, 15.5, 8.0); for (Double p : prices) total += p; - 需要键和值:Map
scores = Map.of("A", 88, "B", 92); for (Map.Entry e : scores.entrySet()) { System.out.println(e.getKey() + "=" + e.getValue()); } - Set 无序但遍历逻辑一样:Set
roles = new HashSet(Arrays.asList("admin", "user")); for (String r : roles) { System.out.println("Role: " + r); }
Java 10+ 小技巧:用 var 省去冗长类型声明
当上下文足够清晰时,var 能让代码更轻量,尤其在泛型嵌套场景下效果明显。
- List
- String[] arr = {"x", "y"}; for (var s : arr) { // s 自动推断为 String }
- 注意:var 不能用于 null 初始化或方法返回值模糊的场景,否则编译失败
必须避开的坑:优雅的前提是守边界
增强 for 是只读契约——它背后是 Iterator 或数组索引访问,任何破坏结构的操作都会引发异常或逻辑错误。
- 禁止边遍历边删元素:for (String s : list) { if (s.isEmpty()) list.remove(s); } → 抛 ConcurrentModificationException,应改用迭代器 remove() 或收集待删项后批量处理
- 无法获取当前下标:若需索引(如“第几个元素满足条件”),老实用传统 for 或引入计数器 int i = 0; for (X x : xs) { ... i++; }
- 不支持反向或跳跃遍历:这些需求天然超出其设计范畴,强行适配反而增加复杂度
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











