这题考什么
- 基础分:能不能一句话说清两者语义差别,别绕。这题是筛选题,说糊了后面追问会被压着打。
- 细节分:
continue之后i++到底执不执行、while里continue会不会死循环、switch里的break算什么。 - 加分项:带标签的
break/continue能跳几层、跟return的边界在哪。面试官想听的是你真的写过、踩过坑,不是背定义。
先说结论
break 是直接结束最近的那层循环(或 switch),continue 是只跳过本次循环剩下的语句,进入下一次迭代;两者都只影响当前所在的那一层,不加标签跳不出外层。
差别到底在哪
| 维度 | break |
continue |
|---|---|---|
| 作用结果 | 结束整个循环,程序走到循环后面 | 只结束本次迭代,循环继续 |
| 循环变量 | 后续不再更新 | 仍会走到更新语句(for 的 i++ 照执行) |
| 作用范围 | 最近的一层 for/while/do-while 或 switch |
最近的一层循环(不能用于 switch 之外的普通块) |
| 典型用途 | 找到目标就退出、超时熔断、switch 防穿透 |
跳过非法数据、过滤、提前进入下一轮 |
| 加标签 | 可以跳任意多层,标签可挂在任意语句块上 | 可以跳多层,但标签必须挂在循环语句上 |
说白了:break 是「收工了」,continue 是「这一条不算,下一条」。
for (int i = 0; i < 10; i++) {
if (i == 3) continue; // 跳过 3
if (i == 7) break; // 到 7 收工
System.out.println(i);
}
// 输出: 0 1 2 4 5 6
循环里它俩怎么走的
关键是记住:continue 不是「回到循环开头」,而是「回到迭代的收尾动作」。在 for 循环里收尾动作就是 i++,在 while/do-while 里就是条件判断。
所以 for 里 continue 是安全的,i++ 照跑;while 里把更新语句写在 continue 后面,就可能死循环。
两个容易翻车的地方
1. while + continue 死循环
int i = 0;
while (i < 5) {
if (i % 2 == 0) continue; // i 永远不更新,卡死在这
i++;
}
改成 for 或者把 i++ 提到 continue 之前就没这事。do-while 里的 continue 是跳到条件判断,条件照样会判,不会直接无限执行循环体。
2. 标签:跳多层循环
Java 没有 goto,但有标签语句,专门解决「双层循环里找到就全退」这类需求:
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) break outer; // 直接跳出两层
if (j == 2) continue outer; // 结束本轮, 跳到外层 i++
System.out.println(i + "-" + j);
}
}
注意两点:break 后的标签可以挂在任意语句块上,continue 后的标签必须挂在循环上,否则编译不过;标签语法是 名字:,跟 switch 里的 case 标签完全两码事。
面试高频追问
break 能跳出几层循环?
默认只跳最近一层,写成 break 标签 可以跳任意多层,但跳不出当前方法,方法边界是硬的。
continue 后面的代码还执行吗?
本次循环不执行了,但 for 的 i++ 会执行,然后回到条件判断。
switch 里的 break 是干嘛的?
防止 case 穿透,跳出整个 switch。switch 里只能用 break(或 return、throw),不能用 continue,因为 continue 是给循环用的;不过在循环里的 switch 里写 continue,作用的是外层循环。
break 和 return 什么区别?
break 只结束循环或 switch,后面代码继续跑;return 直接结束整个方法,连后面的代码都不执行。
break 后面还能写代码吗?
不能,属于不可达代码,编译器直接报 unreachable statement。同理 while (true) 后面如果没 break,下面的代码也算不可达。
带标签的 continue 有什么限制?
标签必须标在循环语句上,写在普通代码块上编译不过。break 的标签则可以是任意语句块。
do-while 里 continue 会怎样?
跳到条件判断,条件还是会判一次,不是无脑再执行一遍循环体。
怎么记:break 是「跳出这个循环」,continue 是「跳过这次循环的后半段」。两条都只管最近那一层,要管更外层就得上标签。