Skip to content

Java流程控制与循环完全指南

目录


一、键盘录入Scanner

1.1 基本概念

Scanner是Java提供的一个类,用于通过键盘录入的形式将数据放到代码中参与运行。

1.2 使用步骤

java
// 1. 导包
import java.util.Scanner;

// 2. 创建对象
Scanner sc = new Scanner(System.in);

// 3. 调用方法录入数据
int data1 = sc.nextInt();      // 录入整数
String data2 = sc.next();       // 录入字符串

1.3 常用方法对比

方法说明结束条件
next()录入字符串遇到空格或回车结束
nextLine()录入字符串遇到回车结束
nextInt()录入整数遇到回车结束

1.4 代码示例

java
import java.util.Scanner;

public class Demo01Scanner {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int data1 = sc.nextInt();
        System.out.println(data1 + 1);

        String data2 = sc.next();
        System.out.println(data2 + 1);
    }
}

二、switch选择语句

2.1 基本格式

java
switch(变量) {
    case 目标值1:
        执行语句1;
        break;
    case 目标值2:
        执行语句2;
        break;
    ...
    default:
        执行语句n;
        break;
}

2.2 执行流程

  1. 用变量的值挨个和case后面的目标值做匹配
  2. 哪个case匹配上了,就走对应的执行语句
  3. 遇到break结束switch语句
  4. 如果所有case都没匹配上,走default语句

2.3 支持的数据类型

  • byte、short、int、char
  • 枚举类型
  • String类型(Java 7+)

2.4 case穿透性

重要特性:如果没有break,代码会一直往下穿透执行,直到遇到break或switch结束。

java
// 利用case穿透性简化代码
switch (month) {
    case 12:
    case 1:
    case 2:
        System.out.println("冬季");
        break;
    case 3:
    case 4:
    case 5:
        System.out.println("春季");
        break;
    // ...
}

2.5 Java新特性(Java 12+)

Java 12:switch表达式

java
// 多case合并
switch (month) {
    case 12, 1, 2:
        System.out.println("冬季");
        break;
    case 3, 4, 5:
        System.out.println("春季");
        break;
}

// 使用箭头语法(自动避免穿透)
switch (month) {
    case 12, 1, 2 -> System.out.println("冬季");
    case 3, 4, 5 -> System.out.println("春季");
    case 6, 7, 8 -> System.out.println("夏季");
    case 9, 10, 11 -> System.out.println("秋季");
    default -> System.out.println("输入的月份有误");
}

Java 13:yield关键字

java
// 使用yield返回值
String season = switch (month) {
    case 12, 1, 2 -> {
        yield "冬季";
    }
    case 3, 4, 5 -> {
        yield "春季";
    }
    default -> {
        yield "输入的月份有误";
    }
};
System.out.println(season);

三、if分支语句

3.1 if第一种格式

java
if (boolean表达式) {
    执行语句;
}

执行流程:先判断,如果是true,执行if后面大括号中的语句。

java
if (data == 100) {
    System.out.println("输入的数据是100");
}

3.2 if第二种格式

java
if (boolean表达式) {
    执行语句1;
} else {
    执行语句2;
}

执行流程:如果boolean表达式为true,执行语句1;否则执行语句2。

示例:判断奇偶数

java
if (data % 2 == 0) {
    System.out.println("偶数");
} else {
    System.out.println("奇数");
}

示例:求两个数的较大值

java
if (data1 > data2) {
    System.out.println(data1);
} else {
    System.out.println(data2);
}

示例:判断闰年

java
// 闰年条件:能被4整除但不能被100整除,或者能被400整除
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
    System.out.println("闰年");
} else {
    System.out.println("平年");
}

3.3 if第三种格式

java
if (boolean表达式1) {
    执行语句1;
} else if (boolean表达式2) {
    执行语句2;
} else if (boolean表达式3) {
    执行语句3;
} else {
    执行语句n;
}

执行流程:从上到下挨个判断,哪个条件为true就走对应的执行语句。

示例:星期判断

java
if (week == 1) {
    System.out.println("星期一");
} else if (week == 2) {
    System.out.println("星期二");
} else if (week == 3) {
    System.out.println("星期三");
} else if (week == 4) {
    System.out.println("星期四");
} else if (week == 5) {
    System.out.println("星期五");
} else if (week == 6) {
    System.out.println("星期六");
} else if (week == 7) {
    System.out.println("星期日");
} else {
    System.out.println("输入的数字有误");
}

示例:成绩奖励

java
if (score >= 95 && score <= 100) {
    System.out.println("山地自行车一辆");
} else if (score >= 90 && score <= 94) {
    System.out.println("游乐场玩一次");
} else if (score >= 80 && score <= 89) {
    System.out.println("变形金刚玩具一个");
} else if (score >= 0 && score <= 79) {
    System.out.println("胖揍一顿");
} else {
    System.out.println("输入的分数有误");
}

四、循环结构

4.1 for循环

基本格式

java
for (初始化变量; 比较布尔表达式; 步进表达式) {
    循环语句;
}

执行流程

  1. 先初始化变量
  2. 比较,如果是true,走循环语句
  3. 走步进表达式(变量值变化)
  4. 再比较,直到比较为false,循环结束

流程图

for循环流程图

示例:打印3次

java
for (int i = 0; i < 3; i++) {
    System.out.println("我爱money");
}

示例:求1-3的和

java
int sum = 0;
for (int i = 1; i <= 3; i++) {
    sum += i;
}
System.out.println(sum); // 输出: 6

示例:求1-100的偶数和

java
int sum = 0;
for (int i = 1; i <= 100; i++) {
    if (i % 2 == 0) {
        sum += i;
    }
}
System.out.println(sum);

4.2 while循环

基本格式

java
初始化变量;
while (比较布尔表达式) {
    循环语句;
    步进表达式;
}

执行流程

  1. 先初始化变量
  2. 比较,如果是true,走循环语句
  3. 走步进表达式
  4. 再比较,直到比较为false,循环结束

示例

java
int i = 1;
while (i <= 10) {
    System.out.println("HelloWorld");
    i++;
}

4.3 do-while循环

基本格式

java
初始化变量;
do {
    循环语句;
    步进表达式;
} while (比较布尔表达式);

特点

至少执行一次,先执行后判断。

示例

java
int i = 1;
do {
    System.out.println("HelloWorld");
    i++;
} while (i < 0); // 即使条件为false,也会执行一次

4.4 三种循环对比

循环类型执行次数使用场景
for可能0次已知循环次数
while可能0次未知循环次数
do-while至少1次至少执行一次

五、常见面试题

5.1 switch相关

⭐ 题目1:case穿透性

java
int x = 2;
switch (x) {
    case 1:
        System.out.println(1);
    case 2:
    case 3:
        System.out.println(3);
    case 4:
        System.out.println(4);
}

答案:输出 3 和 4

解析:case 2没有break,会穿透到case 3和case 4继续执行。


⭐⭐ 题目2:switch穿透计算

java
int i = 10, j = 25, x = 30;
switch (j - i) {
    case 15:
        x++;
    case 16:
        x += 2;
    case 17:
        x += 3;
    default:
        --x;
}
System.out.println(x);

答案:35

解析:j-i=15,匹配case 15后无break,穿透执行所有语句:x=30→31→33→36→35


⭐⭐ 题目3:多选判断

java
int x = 1, a = 0, b = 0;
switch (x) {
    case 0:
        b++;
    case 1:
        a++;
    case 2:
        a++;
        b++;
}
System.out.println("a=" + a);
System.out.println("b=" + b);

答案:a=2, b=1

解析:x=1匹配case 1,无break穿透到case 2,a执行两次++,b执行一次++。


5.2 if相关

⭐ 题目4:if基本判断

java
int a = 3, b = 4, x = 5;
if (a < b) {
    x = x + 1;
}
System.out.println(x);

答案:6


⭐⭐ 题目5:if-else判断

java
int a = 10, b = 3, m = 5;
if (a == b) {
    m += a;
} else {
    m *= a;
}
System.out.println(m);

答案:50

解析:a!=b,执行else分支,m=5*10=50


⭐⭐ 题目6:嵌套if判断

java
if (条件1) {
    if (条件2) {
        语句体1;
    } else {
        语句体2;
    }
}

问题:语句体2在什么情况下执行?

答案:只有当条件1为true且条件2为false时,语句体2才能执行。


5.3 循环相关

⭐ 题目7:while循环次数

java
int i = 1;
while (i <= 10) {
    i++;
    System.out.println("HelloWorld");
}

答案:输出10次HelloWorld

解析:i从1到10,循环10次。


⭐⭐ 题目8:while累加

java
int sum = 0;
int i = 1;
while (i <= 5) {
    sum += i;
    i++;
}
System.out.println(sum);

答案:15

解析:1+2+3+4+5=15


⭐⭐ 题目9:do-while特点

java
int i = 1;
do {
    System.out.println("HelloWorld");
    i++;
} while (i < 0);

答案:输出1次HelloWorld

解析:do-while先执行后判断,至少执行一次。


⭐ 题目10:for循环计数

java
int count = 0;
for (int i = 1; i <= 10; i++) {
    if (i % 3 == 0) {
        count++;
    }
}
System.out.println(count);

答案:3

解析:1-10中3的倍数有3、6、9,共3个。


六、实用代码示例

6.1 计算器功能

java
import java.util.Scanner;

public class Calculator {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("请输入第一个整数:");
        int num1 = sc.nextInt();
        
        System.out.println("请输入第二个整数:");
        int num2 = sc.nextInt();
        
        System.out.println("请输入运算符(0:加 1:减 2:乘 3:除):");
        int operator = sc.nextInt();
        
        switch (operator) {
            case 0:
                System.out.println(num1 + num2);
                break;
            case 1:
                System.out.println(num1 - num2);
                break;
            case 2:
                System.out.println(num1 * num2);
                break;
            case 3:
                System.out.println(num1 / num2);
                break;
            default:
                System.out.println("输入有误");
        }
    }
}

6.2 工龄涨工资

java
import java.util.Scanner;

public class SalaryIncrease {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        System.out.println("请输入工龄:");
        int years = sc.nextInt();
        
        System.out.println("请输入基本工资:");
        int salary = sc.nextInt();
        
        int upSalary;
        
        if (years >= 10 && years < 15) {
            upSalary = 20000;
        } else if (years >= 5 && years < 10) {
            upSalary = 10000;
        } else if (years >= 3 && years < 5) {
            upSalary = 5000;
        } else if (years >= 1 && years < 3) {
            upSalary = 3000;
        } else {
            upSalary = 0;
        }
        
        System.out.println("您目前工作了" + years + "年,基本工资为 " + salary + 
            "元, 应涨工资 " + upSalary + "元,涨后工资 " + (salary + upSalary) + "元");
    }
}

6.3 求三个数最大值

java
import java.util.Scanner;

public class MaxOfThree {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int a = sc.nextInt();
        int b = sc.nextInt();
        int c = sc.nextInt();
        
        int temp;
        if (a > b) {
            temp = a;
        } else {
            temp = b;
        }
        
        int max;
        if (temp > c) {
            max = temp;
        } else {
            max = c;
        }
        
        System.out.println("最大值: " + max);
    }
}

七、经典练习题

7.1 基础题

练习1:打印3和5的倍数

需求:打印1到100之间既是3的倍数又是5的倍数的数字及其和。

java
int sum = 0;
for (int num = 1; num <= 100; num++) {
    if ((num % 3 == 0) && (num % 5 == 0)) {
        System.out.println(num);
        sum += num;
    }
}
System.out.println("以上满足条件的数字之和: " + sum);

输出:15, 30, 45, 60, 75, 90,和为315


练习2:筛选三位数

需求:从键盘录入一个大于100的三位数,打印100到该数字之间满足条件的数字:

  • 个位数不为7
  • 十位数不为5
  • 百位数不为3
java
Scanner sc = new Scanner(System.in);
int maxNum = sc.nextInt();
int sum = 0;
int count = 0;

for (int num = 100; num <= maxNum; num++) {
    int ge = num % 10;
    int shi = num / 10 % 10;
    int bai = num / 100 % 10;
    
    if ((ge != 7) && (shi != 5) && (bai != 3)) {
        System.out.println(num);
        sum += num;
        count++;
    }
}

System.out.println("满足条件的数字之和: " + sum);
System.out.println("满足条件的数字个数: " + count);

7.2 进阶题

练习3:四位数特殊规律

需求:打印所有四位数中,个位+千位==百位+十位的数字,并统计数量。

java
int count = 0;

for (int num = 1000; num <= 9999; num++) {
    int ge = num % 10;
    int shi = num / 10 % 10;
    int bai = num / 100 % 10;
    int qian = num / 1000 % 10;
    
    if ((ge + qian) == (bai + shi)) {
        System.out.println(num);
        count++;
    }
}

System.out.println("以上满足条件的四位数总共有: " + count + "个");

结果:共有615个符合条件的四位数。