核心要点
for-each 循环本身没有像 for 循环那样的 break 和 continue 关键字,它是一种语法糖,在编译后会被转换成使用 Iterator 的 while 循环。

我们跳出 for-each 循环的方法主要有以下三种:
break语句:最常用,用于完全终止整个循环。return语句:直接从当前方法中返回,不仅跳出循环,也终止了方法的执行。- 使用
Iterator.remove():在需要删除元素时使用,这是一种安全的方式。
使用 break 语句
这是最直接、最常用的方法,当 break 语句执行时,会立即终止当前所在的 for-each 循环。
示例:查找列表中第一个大于 5 的数字并停止循环
import java.util.Arrays;
import java.util.List;
public class ForEachBreakExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 6, 4, 5);
System.out.println("使用 break 跳出循环:");
for (Integer number : numbers) {
System.out.println("正在检查数字: " + number);
if (number > 5) {
System.out.println("找到第一个大于5的数字: " + number + ",准备跳出循环。");
break; // 找到后立即终止循环
}
}
System.out.println("循环已结束。");
}
}
输出:

使用 break 跳出循环:
正在检查数字: 1
正在检查数字: 2
正在检查数字: 3
正在检查数字: 6
找到第一个大于5的数字: 6,准备跳出循环。
循环已结束。
使用 return 语句
如果你在循环中找到了你想要的结果,并且这个结果足以让你决定不再继续执行当前方法的其余部分,return 是一个很好的选择。
示例:在方法中使用 return
import java.util.Arrays;
import java.util.List;
public class ForEachReturnExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 6, 4, 5);
findAndPrintFirstLargeNumber(numbers);
System.out.println("方法 main 继续执行。");
}
public static void findAndPrintFirstLargeNumber(List<Integer> numbers) {
System.out.println("进入方法 findAndPrintFirstLargeNumber:");
for (Integer number : numbers) {
System.out.println("正在检查数字: " + number);
if (number > 5) {
System.out.println("找到第一个大于5的数字: " + number + ",从方法中返回。");
return; // 不仅跳出循环,也终止了当前方法的执行
}
}
System.out.println("方法 findAndPrintFirstLargeNumber 执行完毕(未找到大于5的数字)。");
}
}
输出:
进入方法 findAndPrintFirstLargeNumber:
正在检查数字: 1
正在检查数字: 2
正在检查数字: 3
正在检查数字: 6
找到第一个大于5的数字: 6,从方法中返回。
方法 main 继续执行。
注意: return 之后的 System.out.println(...) 代码不会被执行。

使用 Iterator.remove() (特定场景)
这是一个非常特殊但重要的用法。在 for-each 循环中,绝对不能使用集合的 remove() 方法来删除元素,这会抛出 java.util.ConcurrentModificationException 并发修改异常。
for-each 循环内部使用了一个 Iterator 对象,当你尝试在循环中直接修改集合(如 list.remove())时,会破坏 Iterator 期望的状态,从而触发异常。
正确的做法是使用 Iterator 自身的 remove() 方法,这个方法会在不破坏 Iterator 状态的情况下删除上一次 next() 调用返回的元素。
示例:安全地删除集合中的所有偶数
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ForEachIteratorRemoveExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
System.out.println("原始列表: " + numbers);
// 错误示范:在 for-each 中直接 remove 会抛出 ConcurrentModificationException
// for (Integer number : numbers) {
// if (number % 2 == 0) {
// numbers.remove(number); // 错误!
// }
// }
// 正确示范:使用 Iterator
System.out.println("\n使用 Iterator 安全删除偶数:");
// for-each 循环底层就是使用 Iterator,所以我们不能再用它来删除
// 我们必须手动获取 Iterator
Iterator<Integer> iterator = numbers.iterator();
while (iterator.hasNext()) { // 使用 while 循环代替 for-each
Integer number = iterator.next();
if (number % 2 == 0) {
System.out.println("删除偶数: " + number);
iterator.remove(); // 安全地删除当前元素
}
}
System.out.println("\n删除后的列表: " + numbers);
}
}
输出:
原始列表: [1, 2, 3, 4, 5, 6]
使用 Iterator 安全删除偶数:
删除偶数: 2
删除偶数: 4
删除偶数: 6
删除后的列表: [1, 3, 5]
总结与对比
| 方法 | 作用 | 适用场景 | 备注 |
|---|---|---|---|
break |
终止整个循环 | 当找到目标元素或满足某个条件后,不再需要遍历剩余元素时。 | 最常用,最直接。 |
return |
终止循环并退出方法 | 当循环的结果决定了方法的最终走向,无需再执行后续代码时。 | 会立即结束当前方法的执行。 |
Iterator.remove() |
安全删除当前元素 | 需要在遍历集合的同时删除元素时。 | 不能在 for-each 中直接 remove,必须配合 while(iterator.hasNext()) 使用。 |
如何选择?
- 只想停止循环:使用
break。 - 循环的结果就是方法的最终结果:使用
return。 - 想在遍历时删除元素:使用
Iterator的remove()方法(并改用while循环)。
对于绝大多数情况,break 就足够了。for-each 循环是为了简洁和安全地遍历,如果你在循环中需要频繁地修改集合(特别是删除元素),那么传统的 for 循环可能是更好的选择,因为它提供了更大的灵活性。
// 使用传统 for 循环删除元素
for (int i = 0; i < numbers.size(); i++) {
if (numbers.get(i) % 2 == 0) {
numbers.remove(i); // 可以直接操作,但要注意索引变化
i--; // 删除后需要回退索引
}
} 