讲解
循环让同一段代码重复执行。for 循环适合「次数明确」的场景:for (int i = 0; i < 10; i++) 三段式分别是初始化、继续条件、每轮收尾,i 从 0 数到 9 共执行 10 次。while 循环适合「次数不明确、看条件」的场景:只要条件为真就一直转,比如反复读取直到文件结束。do...while 先执行一次再判断条件,保证至少跑一轮,实际用得较少。
break 立即跳出整个循环,continue 跳过本轮直接进下一轮。两者都只作用于最内层循环;想从内层直接跳出外层循环,可以给外层循环加标签(label),用 break 标签名 跳出——可读性一般,能重构就不用。另外遍历数组和集合有专门的「增强 for」语法:for (String name : names) 逐项取出,没有下标可操心,也不存在越界风险。
循环的头号天敌是死循环:条件永远为真,程序原地打转。写 while 时一定确认循环体里有让条件趋向不成立的代码(比如 i++)。第二个常见问题是边界差一(off-by-one):i < 10 和 i <= 10 差一整轮,i 从 0 开始还是从 1 开始也要想清楚。排查循环问题最朴素的办法是在循环里打印关键变量,看它是怎么一步步变化的。
示例
三种循环各跑一次:for 求和、while 倒数、do...while 至少执行一次:
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum += i;
}
System.out.println("1 到 100 的和:" + sum);
int countdown = 5;
while (countdown > 0) {
System.out.println("倒数:" + countdown);
countdown--;
}
int tries = 0;
do {
tries++;
System.out.println("第 " + tries + " 次尝试");
} while (tries < 2);
}
}
break 与 continue:找第一个能被 7 整除的数,并跳过偶数打印:
public class Main {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue;
}
System.out.println("奇数:" + i);
}
int n = 50;
while (true) {
if (n % 7 == 0) {
System.out.println("第一个 >= 50 且能被 7 整除的数:" + n);
break;
}
n++;
}
}
}
增强 for 遍历数组,嵌套循环打印九九乘法表的前三行:
public class Main {
public static void main(String[] args) {
String[] names = {"李明", "王芳", "张伟"};
for (String name : names) {
System.out.println("学生:" + name);
}
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j + "x" + i + "=" + (i * j) + " ");
}
System.out.println();
}
}
}
常见坑
- 循环条件写成 <= 数组长度:数组下标最大是 length - 1,for (int i = 0; i <= arr.length; i++) 最后一轮必然越界。遍历数组优先用增强 for。
- while 里忘记推进条件:while (i < 10) 里不写 i++ 就是死循环。写 while 先问自己:循环体里哪一行让条件最终变成 false?
- 在增强 for 里修改下标相关逻辑:增强 for 拿不到下标,也无法安全地删除元素。需要下标或需要增删时退回普通 for,删除元素更稳妥的做法见集合章节。
- 大括号错位嵌套:嵌套循环不缩进、不加大括号,break 跳出哪一层全靠猜。每层循环都写花括号并保持缩进。
小结
for 管次数、while 管条件、增强 for 管遍历;break 跳出、continue 跳过,写 while 必须保证条件会收敛。下一节学习存放一组同类型数据的容器:数组。