MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Java控制流语句详解

2022-01-027.2k 阅读

一、Java控制流语句概述

在Java编程中,控制流语句决定了程序执行的顺序。它们允许我们根据特定条件做出决策,或者重复执行一段代码。通过控制流语句,我们能够创建复杂的、逻辑丰富的程序。Java主要有三种类型的控制流语句:条件语句、循环语句和跳转语句。每种类型都有其独特的用途和语法,下面我们将详细介绍。

二、条件语句

2.1 if - else语句

if - else语句是Java中最基本的条件语句。它允许程序根据条件的真假来执行不同的代码块。语法如下:

if (condition) {
    // 如果条件为真执行这里的代码
} else {
    // 如果条件为假执行这里的代码
}

其中,condition是一个布尔表达式,其结果要么为true,要么为false。例如:

int num = 10;
if (num > 5) {
    System.out.println("数字大于5");
} else {
    System.out.println("数字小于等于5");
}

在这个例子中,num > 5是条件表达式。由于num的值为10,条件为真,所以输出为“数字大于5”。

if - else语句还可以嵌套使用,以处理更复杂的条件判断:

int score = 85;
if (score >= 90) {
    System.out.println("成绩为A");
} else {
    if (score >= 80) {
        System.out.println("成绩为B");
    } else {
        if (score >= 70) {
            System.out.println("成绩为C");
        } else {
            System.out.println("成绩为D");
        }
    }
}

在这个嵌套的if - else语句中,首先判断score是否大于等于90,如果不满足则进入外层else,然后在内层if - else中继续判断,以此类推。

为了使代码更加简洁,对于这种多层嵌套的if - else,Java提供了else if结构:

int score = 85;
if (score >= 90) {
    System.out.println("成绩为A");
} else if (score >= 80) {
    System.out.println("成绩为B");
} else if (score >= 70) {
    System.out.println("成绩为C");
} else {
    System.out.println("成绩为D");
}

这种写法与嵌套的if - else实现的功能相同,但代码结构更加清晰。

2.2 switch - case语句

switch - case语句用于基于一个表达式的值来选择执行多个分支中的一个。语法如下:

switch (expression) {
    case value1:
        // 当expression的值等于value1时执行这里的代码
        break;
    case value2:
        // 当expression的值等于value2时执行这里的代码
        break;
    ...
    default:
        // 当expression的值与任何case的值都不匹配时执行这里的代码
}

expression必须是一个可以求值为byteshortcharintString(从Java 7开始支持)或者枚举类型的值。case后面的值必须是与expression类型兼容的常量表达式。例如:

int day = 3;
switch (day) {
    case 1:
        System.out.println("星期一");
        break;
    case 2:
        System.out.println("星期二");
        break;
    case 3:
        System.out.println("星期三");
        break;
    case 4:
        System.out.println("星期四");
        break;
    case 5:
        System.out.println("星期五");
        break;
    case 6:
        System.out.println("星期六");
        break;
    case 7:
        System.out.println("星期日");
        break;
    default:
        System.out.println("无效的日期");
}

在这个例子中,day的值为3,所以会执行case 3后面的代码,输出“星期三”。

break关键字用于在执行完一个case分支后跳出switch语句。如果没有break,程序会继续执行下一个case分支的代码,直到遇到break或者switch语句结束。例如:

int num = 2;
switch (num) {
    case 1:
        System.out.println("一");
    case 2:
        System.out.println("二");
    case 3:
        System.out.println("三");
}

在这个例子中,num的值为2,由于没有break,程序会从case 2开始,依次执行case 2case 3的代码,输出为:

二
三

这通常不是我们想要的结果,所以在使用switch - case时,要注意合理使用break

三、循环语句

3.1 for循环

for循环是Java中最常用的循环语句之一,用于在已知循环次数的情况下重复执行一段代码。语法如下:

for (initialization; condition; update) {
    // 循环体,重复执行的代码
}

initialization部分用于初始化循环变量,通常只执行一次。condition是一个布尔表达式,在每次循环开始前检查。如果条件为真,则执行循环体;如果为假,则结束循环。update部分在每次循环结束后执行,用于更新循环变量。例如:

for (int i = 0; i < 5; i++) {
    System.out.println("当前i的值为:" + i);
}

在这个例子中,int i = 0是初始化部分,i < 5是条件部分,i++是更新部分。循环从i = 0开始,每次循环检查i < 5,如果条件满足则输出i的值,然后i自增1。当i的值变为5时,条件不满足,循环结束。

for循环的三个部分都可以省略,但分号不能省略。例如:

int i = 0;
for (; i < 5;) {
    System.out.println("当前i的值为:" + i);
    i++;
}

这种写法与前面的例子功能相同,只是将初始化和更新部分移到了循环外部。

3.2 while循环

while循环用于在条件为真时重复执行一段代码。语法如下:

while (condition) {
    // 循环体,重复执行的代码
}

condition是一个布尔表达式,在每次循环开始前检查。如果条件为真,则执行循环体;如果为假,则结束循环。例如:

int num = 0;
while (num < 5) {
    System.out.println("当前num的值为:" + num);
    num++;
}

在这个例子中,num < 5是条件表达式。开始时num的值为0,条件为真,所以执行循环体,输出num的值并自增1。每次循环结束后,再次检查条件,直到num的值变为5,条件为假,循环结束。

3.3 do - while循环

do - while循环与while循环类似,但它会先执行一次循环体,然后再检查条件。语法如下:

do {
    // 循环体,重复执行的代码
} while (condition);

例如:

int num = 0;
do {
    System.out.println("当前num的值为:" + num);
    num++;
} while (num < 5);

在这个例子中,无论条件num < 5是否为真,循环体都会先执行一次。然后每次循环结束后检查条件,直到num的值变为5,条件为假,循环结束。

3.4 嵌套循环

在Java中,循环语句可以嵌套使用,即一个循环内部可以包含另一个循环。例如,下面是一个用嵌套for循环打印九九乘法表的例子:

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();
}

在这个例子中,外层for循环控制行数,内层for循环控制每行的列数。外层循环每执行一次,内层循环会完整地执行一轮,从而打印出乘法表的一行。

四、跳转语句

4.1 break语句

break语句有两种主要用途:一是在switch - case语句中,用于跳出switch块;二是在循环语句中,用于立即终止循环。例如:

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        break;
    }
    System.out.println("当前i的值为:" + i);
}

在这个例子中,当i的值为5时,执行break语句,循环立即终止,所以输出结果为:

当前i的值为:0
当前i的值为:1
当前i的值为:2
当前i的值为:3
当前i的值为:4

4.2 continue语句

continue语句用于跳过当前循环的剩余部分,直接开始下一次循环。例如:

for (int i = 0; i < 10; i++) {
    if (i == 5) {
        continue;
    }
    System.out.println("当前i的值为:" + i);
}

在这个例子中,当i的值为5时,执行continue语句,跳过本次循环中System.out.println这一行代码,直接开始下一次循环。所以输出结果为:

当前i的值为:0
当前i的值为:1
当前i的值为:2
当前i的值为:3
当前i的值为:4
当前i的值为:6
当前i的值为:7
当前i的值为:8
当前i的值为:9

4.3 return语句

return语句用于从一个方法中返回。它有两种形式:一种是不带返回值的return,用于返回void类型的方法;另一种是带返回值的return,用于返回非void类型的方法。例如:

public class ReturnExample {
    public static int add(int a, int b) {
        return a + b;
    }

    public static void printMessage() {
        System.out.println("这是一个无返回值的方法");
        return;
    }
}

add方法中,return a + b返回两个整数相加的结果。在printMessage方法中,return语句用于结束方法的执行,虽然它没有返回值。

五、控制流语句的综合应用

在实际编程中,我们常常需要综合使用各种控制流语句来实现复杂的功能。例如,下面是一个猜数字游戏的简单实现:

import java.util.Random;
import java.util.Scanner;

public class GuessNumberGame {
    public static void main(String[] args) {
        Random random = new Random();
        int numberToGuess = random.nextInt(100) + 1;
        Scanner scanner = new Scanner(System.in);
        int guess;
        int attempts = 0;

        while (true) {
            System.out.print("请输入你猜的数字(1 - 100):");
            guess = scanner.nextInt();
            attempts++;

            if (guess < numberToGuess) {
                System.out.println("猜小了,请再试一次。");
            } else if (guess > numberToGuess) {
                System.out.println("猜大了,请再试一次。");
            } else {
                System.out.println("恭喜你,猜对了!你一共猜了" + attempts + "次。");
                break;
            }
        }
        scanner.close();
    }
}

在这个游戏中,使用while (true)创建了一个无限循环,用户在循环内不断输入猜测的数字。通过if - else语句判断猜测的数字与随机生成的数字的大小关系,并给出相应提示。当用户猜对时,使用break语句跳出循环。

六、控制流语句的性能优化

在使用控制流语句时,也需要考虑性能问题。例如,在循环语句中,如果循环体执行的操作比较复杂,并且循环次数较多,可能会影响程序的性能。以下是一些性能优化的建议:

  1. 减少循环体内的计算:将循环体内可以提前计算的部分移到循环外部。例如:
// 优化前
for (int i = 0; i < 1000; i++) {
    double result = Math.sqrt(i * i + 10);
    System.out.println(result);
}

// 优化后
double constant = Math.sqrt(10);
for (int i = 0; i < 1000; i++) {
    double result = Math.sqrt(i * i) + constant;
    System.out.println(result);
}

在这个例子中,Math.sqrt(10)在每次循环中都是固定的值,将其移到循环外部可以减少不必要的计算。 2. 避免不必要的嵌套循环:嵌套循环的时间复杂度通常较高,如果可以通过其他方式实现相同功能,应尽量避免使用嵌套循环。例如,对于一些数组操作,可以使用单循环结合数组索引的计算来代替嵌套循环。 3. 合理使用条件语句:在if - else语句中,如果某些条件出现的概率较高,应将其放在前面,这样可以减少不必要的条件判断。例如:

// 假设大部分情况下num大于100
int num = 150;
if (num > 100) {
    // 执行操作1
} else {
    // 执行操作2
}

这样可以提高程序的执行效率。

通过合理使用控制流语句,并进行性能优化,可以编写出高效、健壮的Java程序。无论是开发小型应用还是大型企业级项目,掌握控制流语句的使用都是非常重要的。