for循环适合已知迭代次数的场景,其三部分结构逻辑集中、不易漏更新,常见错误是分号位置写错。
for 循环适合已知迭代次数的场景
当你清楚要执行多少次,或者遍历一个确定长度的数组、集合时,for 最直观。它的三部分结构(初始化、条件判断、更新)写在一行,逻辑集中,不易漏掉循环变量更新。
常见错误是把分号写错位置,比如 for (int i = 0; i 结尾多了一个分号,导致循环体为空,只执行了五次空操作。
- 初始化语句只执行一次,通常定义并赋值循环变量
- 条件表达式在每次循环开始前判断,为
false时立即退出 - 更新语句在每次循环体执行完后运行,不是在条件判断之后立刻执行
for (int i = 0; i < 3; i++) {
System.out.println("i = " + i);
}
// 输出:i = 0, i = 1, i = 2
while 循环强调“条件优先”,适合不确定次数但有明确退出条件的情况
while 在进入循环体前就检查条件,如果初始条件就不满足,循环体一次都不会执行。它比 for 更灵活,适合读取输入、等待状态变化、处理链表等。
容易踩的坑是忘记在循环体内修改判断变量,造成死循环;或者把条件写反,比如用 != 判断浮点数是否到达目标值,因精度问题永远不相等。
- 必须确保循环体内有能影响条件表达式的语句
- 条件中避免使用
==或!=比较浮点数 - 如果需要先执行再判断,别硬套
while,改用do-while
int count = 0;
while (count < 3) {
System.
out.println("count = " + count);
count++; // 忘记这行就会死循环
}
do-while 至少执行一次,适合“先做再问”的交互逻辑
do-while 的特点是循环体无条件执行一次,然后才检查条件。它天然适合菜单选择、用户输入校验这类“至少试一次”的场景。
注意分号不能省:do { ... } while (condition); 结尾的分号是语法必需,漏掉会编译报错 error: ';' expected。
- 条件写在末尾,括号外必须带分号
- 条件判断的是“是否继续”,不是“是否开始”
- 和
while相比,它不适用于需要跳过首次执行的逻辑
int choice;
do {
System.out.print("Enter 1 to continue, 0 to exit: ");
choice = scanner.nextInt();
} while (choice != 0);
三种循环性能没区别,选哪个取决于控制逻辑的自然性
JVM 对这三种循环生成的字节码几乎一致,性能差异可以忽略。真正影响可读性和健壮性的是你是否匹配了语义:遍历数组用 for,等待某个状态用 while,强制至少执行一次用 do-while。
一个常被忽略的细节是作用域:在 for (int i = 0; ...) 中声明的 i 只在循环内可见;而 while 和 do-while 中若在外部声明变量,该变量在循环结束后仍可访问——这点会影响命名冲突和内存生命周期判断。









