while循环先判断后执行,条件为假时一次都不运行;do-while至少执行一次,适合“先干再问”场景;break/continue行为一致,性能无差异。

while 循环先判断后执行,条件不满足时一次都不跑
关键在「入口检查」:每次进入循环体前,必须先求值 while 后的布尔表达式。如果第一次判断就是 false,整个循环体直接跳过,连一次都不执行。
常见错误现象:
想让用户输入密码直到正确,但用 while (input.equals("123")) 却卡死不动——因为初始 input 是空或错的,条件为 false,循环根本没启动。
- 适用场景:需要「安全前置校验」,比如读文件前先检查
file.exists(),或处理集合前确认list != null && !list.isEmpty() - 性能影响:无额外开销,最轻量的循环结构
- 注意点:别把本该初始化的变量写在条件里(如
while ((line = reader.readLine()) != null)是合法且常用,但初学者容易漏掉赋值导致无限循环)
do-while 循环至少执行一次,适合「先干再问」的场景
它把条件判断挪到末尾,所以不管真假,循环体一定执行至少一遍。这是和 while 最本质的区别。
使用场景:
菜单交互、重试逻辑、需要默认行为再校验的流程。比如让用户选 1~3,输错就提示重输——你总得先显示一次菜单,不能一上来就要求输入。
立即学习“Java免费学习笔记(深入)”;
- 典型写法:
do { ... } while (choice 3); - 参数差异:没有额外参数,但括号里的条件是「继续循环的条件」,不是「退出条件」,这点和
while一致,但位置导致语义更易混淆 - 容易踩的坑:结尾分号不能丢,
} while (condition);的;是语法必需,漏了会编译报错error: ';' expected
break 和 continue 在两种循环里行为完全一致
它们不关心外层是 while 还是 do-while,只看当前最近的循环语句块。所以迁移代码时不用调整控制流逻辑。
但要注意嵌套时的作用域:
如果在 do-while 里再套一个 while,break 只跳出内层,不会影响外层 do-while 的执行节奏。
-
break:立即终止当前循环,跳到循环之后的第一条语句 -
continue:跳过本次剩余代码,直接进入下一轮条件判断(对do-while就是跳到末尾的条件检查) - 性能影响:无差异,JVM 层面都是 goto 指令,别为这个纠结选哪个
编译后的字节码其实很接近,但语义不可互换
反编译看的话,while 是 goto + if_icmpne,do-while 是循环体 + if_icmpeq + goto。底层差别小,但人脑理解成本不同。
真正复杂的是状态依赖逻辑:比如循环中修改了判断变量,又在循环外还用它做后续判断,这时候 do-while 多跑一次可能让变量处于意外状态,而 while 则可能让它保持未初始化。
- 调试时注意:断点打在循环开头,
while可能根本进不去;do-while至少停一次 - 别强行替换:看到「至少执行一次」就硬套
do-while,结果把原本该跳过的无效路径也执行了









