杰瑞科技汇

Java foreach 如何跳出循环?

核心要点

for-each 循环本身没有像 for 循环那样的 breakcontinue 关键字,它是一种语法糖,在编译后会被转换成使用 Iteratorwhile 循环。

Java foreach 如何跳出循环?-图1
(图片来源网络,侵删)

我们跳出 for-each 循环的方法主要有以下三种:

  1. break 语句:最常用,用于完全终止整个循环。
  2. return 语句:直接从当前方法中返回,不仅跳出循环,也终止了方法的执行。
  3. 使用 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("循环已结束。");
    }
}

输出:

Java foreach 如何跳出循环?-图2
(图片来源网络,侵删)
使用 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(...) 代码不会被执行。

Java foreach 如何跳出循环?-图3
(图片来源网络,侵删)

使用 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
  • 想在遍历时删除元素:使用 Iteratorremove() 方法(并改用 while 循环)。

对于绝大多数情况,break 就足够了。for-each 循环是为了简洁和安全地遍历,如果你在循环中需要频繁地修改集合(特别是删除元素),那么传统的 for 循环可能是更好的选择,因为它提供了更大的灵活性。

// 使用传统 for 循环删除元素
for (int i = 0; i < numbers.size(); i++) {
    if (numbers.get(i) % 2 == 0) {
        numbers.remove(i); // 可以直接操作,但要注意索引变化
        i--; // 删除后需要回退索引
    }
}
分享:
扫描分享到社交APP
上一篇
下一篇