# Java 控制流程

控制流程是Java程序中的基本构建块,它决定了程序的执行路径。本章将详细介绍Java中的条件语句和循环结构。

# 条件语句

# if-else 语句

if-else语句用于根据条件执行不同的代码块。

// 基本if语句
int score = 85;
if (score >= 60) {
    System.out.println("及格");
}

// if-else语句
if (score >= 90) {
    System.out.println("优秀");
} else {
    System.out.println("继续努力");
}

// if-else if-else语句
if (score >= 90) {
    System.out.println("优秀");
} else if (score >= 80) {
    System.out.println("良好");
} else if (score >= 60) {
    System.out.println("及格");
} else {
    System.out.println("不及格");
}

# switch 语句

switch语句用于多分支选择,适用于等值判断。

int day = 3;
switch (day) {
    case 1:
        System.out.println("星期一");
        break;
    case 2:
        System.out.println("星期二");
        break;
    case 3:
        System.out.println("星期三");
        break;
    default:
        System.out.println("其他日期");
}

// Java 12+ 新特性:switch表达式
String dayType = switch (day) {
    case 1, 2, 3, 4, 5 -> "工作日";
    case 6, 7 -> "周末";
    default -> "无效日期";
};

# 循环结构

# for 循环

for循环用于已知循环次数的场景。

// 基本for循环
for (int i = 0; i < 5; i++) {
    System.out.println("第" + (i + 1) + "次循环");
}

// 增强for循环(for-each)
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    System.out.println(number);
}

// 多重for循环
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.printf("%d×%d=%d ", j, i, i * j);
    }
    System.out.println();
}

# while 循环

while循环用于不确定循环次数的场景。

// 基本while循环
int count = 0;
while (count < 5) {
    System.out.println("count: " + count);
    count++;
}

// 使用while循环读取输入
import java.util.Scanner;

Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
    String input = scanner.nextLine();
    if (input.equals("quit")) {
        break;
    }
    System.out.println("输入的内容:" + input);
}

# do-while 循环

do-while循环保证至少执行一次循环体。

int num = 1;
do {
    System.out.println("num: " + num);
    num *= 2;
} while (num <= 8);

# 控制语句

# break 语句

break用于跳出循环或switch语句。

// 在循环中使用break
for (int i = 1; i <= 10; i++) {
    if (i == 5) {
        break;
    }
    System.out.println(i);
}

// 带标签的break
outer: for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (i == 1 && j == 1) {
            break outer;
        }
        System.out.printf("[%d,%d] ", i, j);
    }
    System.out.println();
}

# continue 语句

continue用于跳过当前循环的剩余部分。

// 跳过偶数
for (int i = 1; i <= 5; i++) {
    if (i % 2 == 0) {
        continue;
    }
    System.out.println(i);
}

// 带标签的continue
outer: for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (j == 1) {
            continue outer;
        }
        System.out.printf("[%d,%d] ", i, j);
    }
}

# 最佳实践

  1. 选择合适的控制结构

    • 对于等值判断,优先使用switch语句
    • 对于区间判断,使用if-else语句
    • 已知循环次数时使用for循环
    • 不确定循环次数时使用while循环
  2. 避免深层嵌套

    // 不推荐
    if (condition1) {
        if (condition2) {
            if (condition3) {
                // 处理逻辑
            }
        }
    }
    
    // 推荐
    if (!condition1 || !condition2 || !condition3) {
        return;
    }
    // 处理逻辑
    
  3. 合理使用break和continue

    • break用于完全跳出循环
    • continue用于跳过当前迭代
    • 避免过度使用,可能影响代码可读性
  4. 循环性能优化

    // 不推荐
    for (int i = 0; i < list.size(); i++) {
        // 每次都要调用size()
    }
    
    // 推荐
    int size = list.size();
    for (int i = 0; i < size; i++) {
        // size只调用一次
    }
    

# 练习

  1. 编写程序判断一个年份是否为闰年

    public boolean isLeapYear(int year) {
        return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    }
    
  2. 使用循环打印九九乘法表

    public void printMultiplicationTable() {
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.printf("%d×%d=%d ", j, i, i * j);
            }
            System.out.println();
        }
    }
    
  3. 编写程序计算斐波那契数列的第n项

    public int fibonacci(int n) {
        if (n <= 1) return n;
        int a = 0, b = 1;
        for (int i = 2; i <= n; i++) {
            int temp = a + b;
            a = b;
            b = temp;
        }
        return b;
    }