Java从零到熟练(三):流程控制

程序的执行顺序决定了程序的行为,掌握流程控制就是掌握程序的"大脑"。

目录

  • [1. 条件判断:if-else](#1. 条件判断:if-else)
  • [2. 条件判断:switch](#2. 条件判断:switch)
  • [3. 循环:for循环](#3. 循环:for循环)
  • [4. 循环:while循环](#4. 循环:while循环)
  • [5. 循环控制:break和continue](#5. 循环控制:break和continue)
  • [6. 实战案例](#6. 实战案例)
  • [7. 用AI工具辅助学习](#7. 用AI工具辅助学习)
  • [8. 总结](#8. 总结)
  • 参考资源

1. 条件判断:if-else

1.1 基本if语句

当条件为true时执行代码块:

java 复制代码
public class IfDemo {
    public static void main(String[] args) {
        int age = 20;
        
        if (age >= 18) {
            System.out.println("你已经成年了!");
        }
        
        System.out.println("程序继续执行...");
    }
}

1.2 if-else语句

根据条件执行不同的代码块:

java 复制代码
public class IfElseDemo {
    public static void main(String[] args) {
        int temperature = 35;
        
        if (temperature >= 30) {
            System.out.println("天气很热,开空调!");
        } else {
            System.out.println("天气凉爽,不用开空调。");
        }
    }
}

1.3 if-else if-else链

处理多个条件:

java 复制代码
public class IfElseChainDemo {
    public static void main(String[] args) {
        int score = 85;
        String grade;
        
        if (score >= 90) {
            grade = "优秀";
        } else if (score >= 80) {
            grade = "良好";
        } else if (score >= 70) {
            grade = "中等";
        } else if (score >= 60) {
            grade = "及格";
        } else {
            grade = "不及格";
        }
        
        System.out.println("成绩:" + score + "分,等级:" + grade);
    }
}

输出:

复制代码
成绩:85分,等级:良好

2. 条件判断:switch

当需要根据一个变量的不同值执行不同操作时,switch比if-else链更清晰:

2.1 基本switch语句

java 复制代码
public class SwitchDemo {
    public static void main(String[] args) {
        int dayOfWeek = 3;
        String dayName;
        
        switch (dayOfWeek) {
            case 1:
                dayName = "星期一";
                break;
            case 2:
                dayName = "星期二";
                break;
            case 3:
                dayName = "星期三";
                break;
            case 4:
                dayName = "星期四";
                break;
            case 5:
                dayName = "星期五";
                break;
            case 6:
                dayName = "星期六";
                break;
            case 7:
                dayName = "星期日";
                break;
            default:
                dayName = "无效日期";
                break;
        }
        
        System.out.println("今天是:" + dayName);
    }
}

输出:

复制代码
今天是:星期三

2.2 现代switch表达式(Java 14+)

使用箭头语法,更简洁:

java 复制代码
public class ModernSwitchDemo {
    public static void main(String[] args) {
        String dayType;
        int day = 3;
        
        // 箭头语法(Java 14+)
        dayType = switch (day) {
            case 1, 2, 3, 4, 5 -> "工作日";
            case 6, 7 -> "周末";
            default -> "无效";
        };
        
        System.out.println("星期" + day + "是" + dayType);
    }
}

2.3 switch vs if-else

场景 推荐使用
判断范围(如 age >= 18 if-else
判断固定值(如 day == 1 switch
多个条件组合 if-else
枚举类型判断 switch

3. 循环:for循环

3.1 基本for循环

重复执行代码块,适合已知循环次数的场景:

java 复制代码
public class ForLoopDemo {
    public static void main(String[] args) {
        // 基本语法:for (初始化; 条件; 更新) { 循环体 }
        
        // 打印1到10
        for (int i = 1; i <= 10; i++) {
            System.out.print(i + " ");
        }
        System.out.println();
        
        // 计算1到100的和
        int sum = 0;
        for (int i = 1; i <= 100; i++) {
            sum += i;
        }
        System.out.println("1到100的和:" + sum);  // 5050
        
        // 打印九九乘法表
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print(j + "×" + i + "=" + (i * j) + "\t");
            }
            System.out.println();
        }
    }
}

3.2 增强for循环(for-each)

遍历数组或集合时更简洁:

java 复制代码
public class ForEachDemo {
    public static void main(String[] args) {
        int[] numbers = {10, 20, 30, 40, 50};
        
        // 增强for循环(for-each)
        System.out.println("增强for循环:");
        for (int num : numbers) {
            System.out.print(num + " ");
        }
        System.out.println();
        
        // 遍历字符串数组
        String[] fruits = {"苹果", "香蕉", "橙子", "葡萄"};
        for (String fruit : fruits) {
            System.out.println("水果:" + fruit);
        }
    }
}

4. 循环:while循环

4.1 基本while循环

条件为true时重复执行,适合不确定循环次数的场景:

java 复制代码
public class WhileLoopDemo {
    public static void main(String[] args) {
        // 打印1到10
        int i = 1;
        while (i <= 10) {
            System.out.print(i + " ");
            i++;
        }
        System.out.println();
    }
}

4.2 do-while循环

至少执行一次循环体,再判断条件:

java 复制代码
public class DoWhileDemo {
    public static void main(String[] args) {
        // 至少执行一次
        int i = 10;
        do {
            System.out.println("i = " + i);
            i++;
        } while (i < 5);  // 条件为false,但已经执行了一次
        
        System.out.println("循环结束,i = " + i);
    }
}

输出:

复制代码
i = 10
循环结束,i = 11

4.3 while vs do-while

特性 while do-while
执行次数 0次或多次 1次或多次
判断时机 循环前 循环后
适用场景 一般循环 至少执行一次

5. 循环控制:break和continue

5.1 break语句

立即终止循环:

java 复制代码
public class BreakDemo {
    public static void main(String[] args) {
        // 查找第一个能被7整除的数
        for (int i = 1; i <= 100; i++) {
            if (i % 7 == 0) {
                System.out.println("第一个能被7整除的数是:" + i);
                break;  // 找到后立即退出循环
            }
        }
    }
}

输出:

复制代码
第一个能被7整除的数是:7

5.2 continue语句

跳过当前迭代,继续下一次循环:

java 复制代码
public class ContinueDemo {
    public static void main(String[] args) {
        // 打印1到20中不能被3整除的数
        System.out.println("1-20中不能被3整除的数:");
        for (int i = 1; i <= 20; i++) {
            if (i % 3 == 0) {
                continue;  // 跳过能被3整除的数
            }
            System.out.print(i + " ");
        }
        System.out.println();
    }
}

输出:

复制代码
1-20中不能被3整除的数:
1 2 4 5 7 8 10 11 13 14 16 17 19 20 

6. 实战案例

6.1 判断闰年

java 复制代码
public class LeapYearDemo {
    public static void main(String[] args) {
        int year = 2024;
        boolean isLeapYear;
        
        // 判断闰年规则:
        // 1. 能被4整除但不能被100整除
        // 2. 能被400整除
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            isLeapYear = true;
        } else {
            isLeapYear = false;
        }
        
        System.out.println(year + "年" + (isLeapYear ? "是" : "不是") + "闰年");
        
        // 输出1-100年中的所有闰年
        System.out.println("\n1-100年中的闰年:");
        for (int y = 1; y <= 100; y++) {
            if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {
                System.out.print(y + " ");
            }
        }
        System.out.println();
    }
}

6.2 打印菱形图案

java 复制代码
public class DiamondDemo {
    public static void main(String[] args) {
        int rows = 5;
        
        // 上半部分(包括中间行)
        for (int i = 1; i <= rows; i++) {
            // 打印空格
            for (int j = 1; j <= rows - i; j++) {
                System.out.print(" ");
            }
            // 打印星号
            for (int k = 1; k <= 2 * i - 1; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
        
        // 下半部分
        for (int i = rows - 1; i >= 1; i--) {
            // 打印空格
            for (int j = 1; j <= rows - i; j++) {
                System.out.print(" ");
            }
            // 打印星号
            for (int k = 1; k <= 2 * i - 1; k++) {
                System.out.print("*");
            }
            System.out.println();
        }
    }
}

输出:

复制代码
    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

6.3 质数判断与打印

java 复制代码
public class PrimeDemo {
    public static void main(String[] args) {
        // 判断一个数是否是质数
        int number = 17;
        boolean isPrime = true;
        
        if (number < 2) {
            isPrime = false;
        } else {
            for (int i = 2; i <= Math.sqrt(number); i++) {
                if (number % i == 0) {
                    isPrime = false;
                    break;
                }
            }
        }
        
        System.out.println(number + (isPrime ? "是" : "不是") + "质数");
        
        // 打印1-100中的所有质数
        System.out.println("\n1-100中的质数:");
        for (int n = 2; n <= 100; n++) {
            boolean prime = true;
            for (int i = 2; i <= Math.sqrt(n); i++) {
                if (n % i == 0) {
                    prime = false;
                    break;
                }
            }
            if (prime) {
                System.out.print(n + " ");
            }
        }
        System.out.println();
    }
}

7. 用AI工具辅助学习

7.1 让AI解释循环

提示词:

复制代码
请解释这段代码的执行过程:

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        if (i + j == 5) {
            System.out.println("i=" + i + ", j=" + j);
            break;
        }
    }
}

8. 总结

本篇我们学习了:

if-else :条件判断的基本形式

switch :多值判断的清晰写法

for循环 :已知次数的循环

while循环 :不确定次数的循环

do-while :至少执行一次的循环

break/continue:循环控制

核心要点:

  1. 选择合适的循环结构:for适合已知次数,while适合条件判断
  2. break和continue是控制循环的利器,但要谨慎使用
  3. 避免无限循环,确保有退出条件
  4. 嵌套循环不要超过3层,保持代码可读性

下一篇预告: 《Java从零到熟练(四):面向对象基础》

  • 理解面向对象编程思想
  • 学习类和对象的概念
  • 掌握封装、继承、多态

参考资源

  1. Java语言规范 - 语句
  2. Java教程 - 控制流语句
  3. 廖雪峰Java教程 - 流程控制

下一篇: Java从零到熟练(四):面向对象基础

相关推荐
唐青枫2 小时前
Java Optional 实战指南:优雅处理空值与链式转换
java
一起学开源2 小时前
一文读懂 ReAct 范式:让 AI Agent 真正学会“思考+行动“
java·javascript·react.js·ecmascript·react·alibaba·智能体开发
asdzx672 小时前
使用 Python 快速提取 PDF 中的表格
python·pdf
无情的西瓜皮2 小时前
MCP协议实战:用Python从零搭建一个AI Agent工具服务器(保姆级教程)
服务器·人工智能·python·mcp
云泽8082 小时前
C++ 可调用对象通关指南:深度解析 Lambda 表达式、function 包装器与 bind 绑定器
开发语言·c++·算法
逍遥德3 小时前
MQTT教程详解-04.SpringBoot集成MQTT(告别手动控制)
java·spring boot·物联网·中间件·iot·iotdb
岁月宁静3 小时前
驾驭 AI 这匹野马:深入解析智能体 Harness 工程
vue.js·python
语戚3 小时前
力扣 3161. 块放置查询:线段树解法(Java 实现)
java·算法·leetcode·面试·线段树·力扣·
我命由我123454 小时前
Android 开发问题:MlKitException: An internal error occurred during initialization.
android·java·java-ee·android jetpack·android-studio·androidx·android runtime