问题
break 与 continue 有何区别?
答案
核心区别
| 关键字 | 作用 | 影响范围 | 典型场景 |
|---|---|---|---|
| break | 终止整个循环或 switch 语句 | 跳出当前循环体 | 找到目标后提前退出 |
| continue | 跳过本次循环的剩余代码 | 仅跳过当前迭代 | 过滤不符合条件的数据 |
简单记忆:
break:打断循环,不再执行后续所有迭代continue:继续下一次迭代,跳过本次剩余代码
break 详解
1. 基本用法
break 用于立即终止当前循环(for、while、do-while)或 switch 语句,跳转到循环体之后的代码。
// 示例:找到第一个偶数后退出
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
System.out.println("找到第一个偶数: " + i);
break; // 终止循环
}
System.out.println("检查: " + i);
}
System.out.println("循环结束");
// 输出:
// 检查: 1
// 找到第一个偶数: 2
// 循环结束
2. 在嵌套循环中的行为
break 只终止最内层的循环:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
break; // 只终止内层循环
}
System.out.println("i=" + i + ", j=" + j);
}
}
// 输出:
// i=1, j=1
// i=2, j=1
// i=3, j=1
3. 带标签的 break(跳出多层循环)
使用标签(label)可以跳出外层循环:
outer: // 定义标签
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (i == 2 && j == 2) {
break outer; // 跳出外层循环
}
System.out.println("i=" + i + ", j=" + j);
}
}
System.out.println("循环结束");
// 输出:
// i=1, j=1
// i=1, j=2
// i=1, j=3
// i=2, j=1
// 循环结束
4. 在 switch 中的使用
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break; // 防止穿透到下一个 case
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break; // 如果没有 break,会继续执行 case 4
default:
System.out.println("其他");
}
continue 详解
1. 基本用法
continue 用于跳过本次循环的剩余代码,直接进入下一次迭代。
// 示例:只打印奇数
for (int i = 1; i <= 5; i++) {
if (i % 2 == 0) {
continue; // 跳过偶数
}
System.out.println("奇数: " + i);
}
// 输出:
// 奇数: 1
// 奇数: 3
// 奇数: 5
2. 在嵌套循环中的行为
continue 只影响最内层的循环:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
continue; // 跳过内层循环的本次迭代
}
System.out.println("i=" + i + ", j=" + j);
}
}
// 输出:
// i=1, j=1
// i=1, j=3
// i=2, j=1
// i=2, j=3
// i=3, j=1
// i=3, j=3
3. 带标签的 continue(跳到外层循环的下一次迭代)
outer:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (j == 2) {
continue outer; // 跳到外层循环的下一次迭代
}
System.out.println("i=" + i + ", j=" + j);
}
}
// 输出:
// i=1, j=1
// i=2, j=1
// i=3, j=1
对比示例
public class BreakVsContinue {
public static void main(String[] args) {
System.out.println("=== 使用 break ===");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
break; // 遇到 3 时终止循环
}
System.out.println(i);
}
// 输出: 1 2
System.out.println("\n=== 使用 continue ===");
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue; // 遇到 3 时跳过本次,继续下一次
}
System.out.println(i);
}
// 输出: 1 2 4 5
}
}
实际应用场景
break 的典型场景
- 查找目标后提前退出
// 在数组中查找元素
int[] arr = {1, 3, 5, 7, 9};
int target = 5;
boolean found = false;
for (int num : arr) {
if (num == target) {
found = true;
break; // 找到后立即退出
}
}
- 满足条件时终止处理
// 读取文件直到遇到特定标记
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
if (line.equals("END")) {
break; // 遇到结束标记,停止读取
}
process(line);
}
continue 的典型场景
- 过滤不符合条件的数据
// 只处理正数
for (int num : numbers) {
if (num <= 0) {
continue; // 跳过非正数
}
processPositiveNumber(num);
}
- 跳过异常数据
// 批量处理,跳过无效记录
for (Record record : records) {
if (!record.isValid()) {
continue; // 跳过无效记录
}
saveToDatabase(record);
}
性能与最佳实践
1. 避免过度使用
过多的 break 和 continue 会降低代码可读性:
// ❌ 不推荐:逻辑混乱
for (int i = 0; i < 100; i++) {
if (condition1) continue;
if (condition2) break;
if (condition3) continue;
// 实际逻辑
}
// ✅ 推荐:提取方法,逻辑清晰
for (int i = 0; i < 100; i++) {
if (shouldProcess(i)) {
process(i);
}
}
2. 优先使用条件判断
简单场景下,条件判断比 continue 更清晰:
// 使用 continue
for (int i = 0; i < 10; i++) {
if (i % 2 != 0) continue;
System.out.println(i);
}
// 更清晰的写法
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) {
System.out.println(i);
}
}
3. 标签的使用建议
- 标签可以跳出多层循环,但会降低可读性
- 优先考虑提取方法或使用标志变量
// 使用标签
outer:
for (...) {
for (...) {
if (condition) break outer;
}
}
// 更好的方式:提取方法
public boolean findTarget() {
for (...) {
for (...) {
if (condition) return true; // 直接返回
}
}
return false;
}
常见误区
- continue 不能用于 switch:
continue只能用于循环,不能用于 switch 语句 - break 不会跳出方法:
break只终止循环,不会像return那样退出方法 - 标签必须在循环前:标签只能标记循环或代码块,不能标记普通语句
面试答题要点
- 核心区别:break 终止循环,continue 跳过本次迭代
- 作用范围:默认只影响最内层循环,可通过标签控制外层循环
- 使用场景:break 用于提前退出,continue 用于过滤数据
- 代码示例:通过简单循环展示两者的执行流程差异
- 最佳实践:避免过度使用,优先考虑清晰的条件判断
这道题考察对 Java 流程控制语句的理解,以及代码可读性的把握。