☕ 第二章 Java编程基础

2.5 循环结构语句

📄 一句话概括

循环 = 让程序重复干活。核心是三要素:初始化(起点)→ 条件(闸门)→ 更新(往前挪)。三种写法 while、do…while、for 只是三要素摆放的位置不同,转的圈一模一样。

前置知识:2.4 选择结构语句(条件判断的套路)、2.3 Java中的运算符(i++ 在这节高频上岗)。


1. 为什么需要循环

想打印 1 到 5,不用循环要写 5 行 System.out.println;打印 1 到 10000 呢?循环把"重复的动作"写一遍,让电脑替你重复一万次——这是电脑和人的分水岭:人抄 100 遍会疯,电脑算一亿次面不改色。

2. for 循环:三要素写在一行

for (int i = 1; i <= 5; i++) {
    System.out.println("第" + i + "遍");
}

for 括号里的三段(用分号隔开,不是逗号):

位置 代码 作用 执行时机
① int i = 1 初始化(起点) 只执行一次
② i <= 5 条件(闸门) 每圈开头都问
③ i++ 更新(往前挪) 每圈末尾执行

执行路线(对应上面的图):① 初始化(一次)→ ② 问条件 → true → ③ 干活 → ④ 更新 → 回到 ② 再问 → …… → 某次条件 false → 跳出,继续走循环后面的代码。

💡 读循环的正确姿势

拿张纸手动"人肉运行":i=1 打印 → i=2 打印 → … → i=5 打印 → i=6 时条件 6<=5 为 false,跳出。共打印 5 遍,i 的最终值是 6。初学阶段每看到一个循环都手动转两圈,比看十遍讲解都管用。

变量作用域注意:int i 写在 for 括号里,出了循环就消失(2.2 的作用域规则)。想在循环外面用 i,就把声明挪到 for 前面。

3. while 循环:先问再干

int i = 1;              // 初始化
while (i <= 5) {        // 条件
    System.out.println(i);
    i++;                // 更新
}

三要素被拆散在三个地方,但缺一不可。最常见的事故:忘了写 i++——条件永远成立,程序卡死在里面(死循环)。

适用场景:事先不知道要转几圈——"等用户输对密码为止""文件没读完就继续读"。

4. do…while:先干一次再问

int i = 1;
do {
    System.out.println(i);
    i++;
} while (i <= 5);      // ← 别忘了这个分号!

和 while 唯一的区别:先执行一次循环体,再判断条件——所以 do…while 至少跑一次。

int x = 100;
while (x < 10) {          // 条件一开始就 false:一次都不跑
    System.out.println("while 跑了");
}
do {
    System.out.println("do…while 跑了");   // 照样输出一次!
} while (x < 10);

适用场景:"必须先做一次"的事——菜单(先显示菜单再问选几)、输密码(先让输再说对不对)。

5. 三种循环怎么选

循环 三要素位置 特点 典型场景
for 挤在一行 知道圈数时最清爽 打印 100 遍、遍历 1~100
while 拆三处 先问再干,可能一次不跑 不知道圈数:"直到输对为止"
do…while 拆三处+先干 至少跑一次 菜单、强制先执行的动作

能互相改写,转的圈一模一样——选哪个只看哪种写着最顺眼。初学先用熟 for,它占日常的八成。

6. 嵌套循环:圈里还有圈

for (int i = 1; i <= 3; i++) {          // 外圈:管"第几组"
    for (int j = 1; j <= 3; j++) {      // 内圈:管"组内第几个"
        System.out.println("外" + i + "-内" + j);
    }
}
// 共 3 × 3 = 9 行输出:外1-内1、外1-内2、外1-内3、外2-内1……

口诀:外圈走一步,内圈跑完整圈。 九九乘法表就是它的经典应用(动手部分有)。

7. break 和 continue:圈里的"急刹"和"跳过"

for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;        // 急刹:整个循环直接结束,跳到循环外面
    }
    System.out.println(i);    // 输出 1 2 3 4
}

for (int i = 1; i <= 10; i++) {
    if (i % 2 == 0) {
        continue;     // 跳过本轮:直接回到 i++ 问下一轮
    }
    System.out.println(i);    // 输出 1 3 5 7 9
}
关键字 动作 一句话
break 整个循环立刻结束 "不干了,走人"
continue 本轮到此为止,回到更新接着转 "这个跳过,下一个"

和 2.4 的 switch 对照着记:switch 里 break 管"出口",循环里 break 管"急刹"——都是"到此为止"。

8. 死循环:是事故,也是工具

for (;;) { }                    // 没有条件 → 永远转
while (true) {                  // 显式永远 true
    // 服务器就靠它常驻:一直转,等请求进来再干活
}

9. 动手:Demo06 三个经典练习

第 1 步:IDEA02 项目 → src → New → Java Class → Demo06,psvm 生成主方法。

第 2 步:抄入求和程序:

public class Demo06 {
    public static void main(String[] args) {
        int sum = 0;                     // 累加器:先声明在循环外
        for (int i = 1; i <= 100; i++) {
            sum += i;                    // 2.3 的 += 上岗
        }
        System.out.println("1~100的和:" + sum);   // 5050
    }
}
⚠️ 第 2 步注意

sum 必须声明在 for 外面——写在括号里的话每圈都被重置成 0,转 100 圈最后还是 0。这是"累加器"套路的关键一步,也是作用域知识的实战。

第 3 步:再写一个偶数和(练 continue 或改条件,两种写法各试一次)。

第 4 步(进阶,九九乘法表):

for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print(j + "×" + i + "=" + j * i + "\t");
    }
    System.out.println();     // 内圈跑完换一行
}

第 5 步(30 秒实验):把求和的 i <= 100 删掉更新 i++ 试试——看死循环长什么样,然后 ■ 强停。亲眼见过一次,你对"三要素"的敬畏就到位了。

10. 常见误区小结

⚠️ 误区 1:for 括号里用逗号

三段用分号隔开:for (int i = 1; i <= 5; i++),两个分号一个不能少(可以省内容,不能省分号)。

⚠️ 误区 2:忘了更新(i++)

条件永远成立 → 死循环。卡死不慌,■ 强停,检查三要素。

⚠️ 误区 3:`i <= 100` 和 `i < 100` 随手写

差一整个数:<= 100 转 100 圈,< 100 转 99 圈。"差一错误"(off-by-one)是循环界第一 bug,写完手动转两圈验证边界。

⚠️ 误区 4:do…while 结尾没分号

} while (条件); ——这里要分号,和 while 的 } 直接收尾不同。

⚠️ 误区 5:以为 continue 会结束循环

continue 只跳过本轮,循环还活着;break 才是整个结束。记反了输出数量会完全对不上。


11. 自测题

❓ Q1:`for (int i = 0; i < 3; i++)` 循环体执行几次?循环结束后 i 的值是多少?

3 次(i = 0, 1, 2 各转一圈)。结束后 i = 3——第 4 次检查时 3 < 3 为 false 才跳出,i 已经变成 3 了。注意这题的 i 从 0 开始,和笔记例子的从 1 开始不同,"差一"就差在这。

❓ Q2:while 和 do…while 的唯一区别是什么?各举一个"只能用它"的场景。

do…while 先执行一次循环体再判断,至少跑一次。do…while 场景:先显示菜单再问选择(不先显示一次就没得选);while 场景:等用户输入正确密码(错了重来,但输入这个动作也可以交给 do…while——只要"先做一次"说得通)。

❓ Q3:下面代码输出什么?
for (int i = 1; i <= 10; i++) {
    if (i == 3) continue;
    if (i == 7) break;
    System.out.println(i);
}

输出 1、2、4、5、6。i=3 被 continue 跳过;i=7 时 break 整个结束,8/9/10 不再执行。

❓ Q4:`int sum = 0; for (int i = 1; i <= 100; i++) { sum += i; }` 用一句话向别人解释 sum 为什么最后是 5050。

累加器套路:sum 住在循环外不重置,每圈把 i 加进去——第 1 圈加 1、第 2 圈加 2……第 100 圈加 100,等价于 1+2+…+100。关键在 sum 声明在循环外。

❓ Q5:打印 1~100 中所有 3 的倍数,写出两种不同写法(一个用条件,一个用 continue)。

① for (int i = 3; i <= 100; i += 3) { System.out.println(i); }(直接从 3 步进 3);② for (int i = 1; i <= 100; i++) { if (i % 3 != 0) continue; System.out.println(i); }(2.3 的取余 + 本节的 continue 合作)。两条路都对——循环题往往不止一种解。


12. 下一步学什么


13. 相关笔记