Java for-each 循环(增强型遍历循环)详解
一、本质与语法
// 标准语法 (Java 5+)
for (ElementType element : Iterable/Array) {
// 操作element
}
// 等效传统实现
Iterator<ElementType> it = collection.iterator();
while (it.hasNext()) {
ElementType element = it.next();
// 操作element
}
- 设计目标:简化集合/数组遍历,消除显式迭代器操作
- 底层机制:
- 对
Iterable对象:自动调用iterator()获取迭代器 - 对数组:转换为传统索引循环(编译后字节码可见)
- 对
二、核心特性
-
强制类型安全
List<String> list = Arrays.asList("A", "B"); for (Integer num : list) {} // 编译错误:类型不匹配 -
不可变性保证
for (final String s : list) { s = "new"; // 编译错误:final修饰符 } -
空指针防护
for (Object obj : null) { ... } // 运行时抛出NullPointerException
三、适用场景与限制
| 支持的数据结构 | 不支持的操作场景 |
|---|---|
所有实现Iterable的集合 | 遍历时删除元素(需用Iterator.remove()) |
| 数组 | 需要反向遍历 |
| 自定义可迭代对象 | 需要同时访问索引 |
四、典型错误案例
-
并发修改异常
List<String> list = new ArrayList<>(Arrays.asList("A", "B")); for (String s : list) { list.remove(s); // 抛出ConcurrentModificationException }✅ 修正方案:改用迭代器遍历 +
remove() -
对象引用陷阱
List<StringBuilder> list = new ArrayList<>(); list.add(new StringBuilder("Hello")); for (StringBuilder sb : list) { sb.append(" World"); // 修改对象内部状态 ✔️ sb = new StringBuilder(); // 仅改变局部引用 ✖️ }
五、性能对比分析
| 数据结构 | for-each | 传统for循环 | 推荐方案 |
|---|---|---|---|
| ArrayList | 迭代器遍历(稍慢) | 索引直接访问(快) | 大数据量选传统式 |
| LinkedList | 迭代器遍历(快) | 索引遍历(O(n²)) | 必须用for-each |
| HashSet | 唯一安全遍历方式 | 无法直接使用索引 | 强制使用for-each |
六、高级应用技巧
-
多维数组遍历
int[][] matrix = {{1,2}, {3,4}}; for (int[] row : matrix) { for (int num : row) { System.out.print(num + " "); } } -
自定义可迭代对象
class MyIterable implements Iterable<String> { public Iterator<String> iterator() { return Arrays.asList("A","B").iterator(); } } -
并行遍历优化(Java 8+)
list.parallelStream().forEach(element -> { // 多线程处理(注意线程安全) });
七、最佳实践指南
-
优先选择场景
- 只读遍历操作
- 无需索引的线性访问
- 代码可读性要求高
-
规避风险策略
// 防御性复制(针对可能被修改的集合) for (String s : new ArrayList<>(originalList)) { originalList.remove(s); // 安全操作 } -
类型推断优化(Java 10+)
var entries = Map.of(1,"A",2,"B").entrySet(); for (var entry : entries) { System.out.println(entry.getKey() + ":" + entry.getValue()); }
深度扩展:Java 14引入的
Records类型可与for-each循环完美配合:record Point(int x, int y) {} List<Point> points = List.of(new Point(1,2), new Point(3,4)); for (Point(var x, var y) : points) { // 模式匹配解构(Java 17预览特性) System.out.println(x + "," + y); }

817

被折叠的 条评论
为什么被折叠?



