Java增强for循环专为遍历一维数组和Iterable集合设计,不支持HashMap、多维数组等;语法为for(类型 变量:对象),需注意类型匹配、空值处理及禁止遍历中修改集合结构。

Java 中增强 for 循环(for-each)专为简洁、安全地遍历数组和集合设计,语法直白,语义清晰,适合只读场景。它不是性能黑科技,但能显著减少出错、提升可读性。
能遍历什么?明确支持范围
增强 for 只接受两类对象:
-
一维数组:包括
int[]、String[]、MyClass[]等,无论基本类型还是引用类型 -
实现 Iterable 接口的集合:如
ArrayList、LinkedList、HashSet、TreeSet、LinkedHashSet
不支持直接遍历:HashMap(需转 keySet()/values()/entrySet())、int[][](只能遍历外层数组,得到的是 int[])、普通对象、未实现 Iterable 的自定义容器。
怎么写?语法和类型匹配要点
基本格式是:for (元素类型 变量名 : 可迭代对象) { ... }。关键在“元素类型”必须与实际元素兼容:
立即学习“Java免费学习笔记(深入)”;
- 遍历
String[] names = {"A", "B"},可用String s或Object s(父类向上转型),但不能用int i(编译失败) - 遍历
Integer[] nums = {1, null, 3}:声明int x会自动拆箱,遇到null抛NullPointerException;声明Integer x安全,但有装箱开销 - 遍历
int[] arr = {1,2,3}:声明Integer x会自动装箱,无空指针风险,但创建多余对象
建议遍历前判空:if (list != null && !list.isEmpty()) { for (String s : list) { ... } }
遍历集合时最常踩的坑
增强 for 的最大限制是禁止边遍历边修改集合结构:
- 在
for (String s : list)中调用list.remove(s)或list.add("x"),会立即抛ConcurrentModificationException(单线程下也会触发,是 fail-fast 机制) - 安全删除:改用
Iterator.remove(),或 JDK 8+ 的list.removeIf(s -> s.startsWith("A")) - 安全添加:先用
List<String> toAdd = new ArrayList<>()收集待加元素,循环结束后再list.addAll(toAdd)
数组不受此限(长度固定),但注意:修改循环变量(如 int x = 5; x++)不会影响原数组元素值,因为基本类型传的是值副本。
Map 和多维数组怎么处理?
它们不能直接进增强 for,但有标准解法:
-
HashMap 遍历:
- 键:
for (String key : map.keySet()) { ... } - 值:
for (Integer value : map.values()) { ... } - 键值对:
for (Map.Entry<String, Integer> e : map.entrySet()) { String k = e.getKey(); int v = e.getValue(); }
- 键:
-
二维数组展开:用嵌套增强 for:
for (int[] row : matrix) { for (int cell : row) { System.out.println(cell); } }
不复杂但容易忽略细节。


















