问题

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 的典型场景

  1. 查找目标后提前退出
// 在数组中查找元素
int[] arr = {1, 3, 5, 7, 9};
int target = 5;
boolean found = false;

for (int num : arr) {
    if (num == target) {
        found = true;
        break;  // 找到后立即退出
    }
}
  1. 满足条件时终止处理
// 读取文件直到遇到特定标记
while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    if (line.equals("END")) {
        break;  // 遇到结束标记,停止读取
    }
    process(line);
}

continue 的典型场景

  1. 过滤不符合条件的数据
// 只处理正数
for (int num : numbers) {
    if (num <= 0) {
        continue;  // 跳过非正数
    }
    processPositiveNumber(num);
}
  1. 跳过异常数据
// 批量处理,跳过无效记录
for (Record record : records) {
    if (!record.isValid()) {
        continue;  // 跳过无效记录
    }
    saveToDatabase(record);
}

性能与最佳实践

1. 避免过度使用

过多的 breakcontinue 会降低代码可读性:

// ❌ 不推荐:逻辑混乱
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;
}

常见误区

  1. continue 不能用于 switchcontinue 只能用于循环,不能用于 switch 语句
  2. break 不会跳出方法break 只终止循环,不会像 return 那样退出方法
  3. 标签必须在循环前:标签只能标记循环或代码块,不能标记普通语句

面试答题要点

  1. 核心区别:break 终止循环,continue 跳过本次迭代
  2. 作用范围:默认只影响最内层循环,可通过标签控制外层循环
  3. 使用场景:break 用于提前退出,continue 用于过滤数据
  4. 代码示例:通过简单循环展示两者的执行流程差异
  5. 最佳实践:避免过度使用,优先考虑清晰的条件判断

这道题考察对 Java 流程控制语句的理解,以及代码可读性的把握。