首页 专题 文章 代码 归档
Java 流程控制
2020.02.26 10:07 2020.02.26 10:07

在Java程序中,JVM默认总是顺序执行以分号;结束的语句。但是,在实际的代码中,程序经常需要做条件判断、循环,因此,需要有多种流程控制语句,来实现程序的跳转和循环等功能。

1. 输入输出

介绍流程控制之前,我们先来介绍一下Java中的输入输出!

1.1. 输入

java的输入,我们用到Scanner类,可以用它创建一个对象

Scanner scanner = new Scanner(System.in);

然后scanner对象调用nextBoolean(),nextByte(),nextShort(),nextInt(),nextLong(),nextFloat(),nextDouble()方法来从输入流中获取数据。

这些方法在执行时都会阻塞,程序等待用户在输入流中输入enter键(\n)时继续执行。 这里的nextInt,hasNextInt()这些方法的调用,会判断当前字节流里面是否有东西,没有就阻塞等待输入直到用户按enter键(\n)结束输入。

例子:

private static void test01() {
    Scanner scanner = new Scanner(System.in);
    String next = scanner.next();
    System.out.println("您输入的内容:" + next);
}

截图-1582621417

疑问:上面一大堆nextXxxx();函数什么呢?

这一大堆next都是接受用户输入的函数,Xxxx代表返回值类型不同罢了!


scanner.hasNext();

private static void test01() {
    Scanner scanner = new Scanner(System.in);
    // String next = scanner.next();
    // System.out.println("您输入的内容:" + next);

    // 一直等待输出
    while (scanner.hasNext()) {
        System.out.println(scanner.next());
    }
}

上面这段代码等待用户的输入,然后立即输出到屏幕上!

截图-1582621642

1.2. 输出

可用System.out.println()System.out.print()来向屏幕进行输出。

jdk1.5新增了和C语言中printf函数类似的数据输出方法。

也即可以格式化输出结果

System.out.printf(“格式控制部分”,表达式1,表达式2,……,表达式n);

格式控制部分由格式控制符号:%d,%c,%f,%s和普通字符组成,普通字符原样输出。

格式控制符用来输出表达式的值。

占位符 说明
%d 格式化输出整数
%x 格式化输出十六进制整数
%f 格式化输出浮点数
%e 格式化输出科学计数法表示的浮点数
%s 格式化字符串

注意,由于%表示占位符,因此,连续两个%%表示一个%字符本身。

private static void test02() {
    int a = 12;
    System.out.printf("a=%d,a++=%d",a,++a);//两个占位符,那么必须传入两个两个数
}

2. if判断

if...else 语句:

编写格式:

if(条件){
        //if语句执行体
    }else{
        //else执行体
    }
   // 当if中的条件为true,执行if执行体,否则执行else

请看一个综合前面知识点的例子:

private static void test03() {
    int a = 16;
    while (a > 0) {
        if (a % 2 == 0)//是偶数
        {
            System.out.printf("%d是偶数\n", a);
        } else {

            System.out.printf("%d是奇数\n", a);
        }
        //a要每次减一,以跳出while循环。while循环我们稍后讲
        a--;
    }
}

结果:

截图-1582622252

你知道上面这个例子我们综合了前面多少个小知识点么?看看你和我总结的一样么:

  1. %取余运算
  2. \n转义字符,代表换行
  3. System.out.printf格式化输出
  4. a--,自减运算

if else if ... else if ... else语句:

格式:

if(条件){
    if语句执行体
}else if(条件){
    if执行体
}else if(条件){
    if执行体
}else{
    else执行体
}

请看例子:

private static void test04() {
    Scanner scanner = new Scanner(System.in);
    System.out.print("请输入成绩:");
    int grade = scanner.nextInt();
    if (grade >= 90) {
        System.out.println("成绩优秀:" + grade);
    } else if (grade >= 80) {
        System.out.println("成绩良好:" + grade);
    } else if (grade >= 60) {
        System.out.println("成绩一般:" + grade);
    } else {
        System.out.println("成绩不及格:" + grade);
    }
}

截图-1582622474


if与三元运算符

前面我们说了,简单的if可以替换成三元运算符:

private static void test05() {
    int a = 12;
    int b = 15;
    if (a > b) {
        System.out.println("两者中大数为:" + a);
    } else {
        System.out.println("两者中大数为:" + b);
    }

    // 替换成下面的三元运算符:
    int c = a > b ? a : b;
    System.out.println("c = " + c);

}

注意:简单的if替换成三元运算符没有任何问题,但是将一些复杂的if替换成三元运算符就有些得不偿失了!

3. switch语句

除了if语句外,还有一种条件判断,是根据某个表达式的结果,分别去执行不同的分支

比如在某腾游戏登录中,一般有:

  • 游客登录(IOS)
  • 微信登录
  • QQ登录

那么这就可以使用switch来判断选择。

switch语句根据switch (表达式)计算的结果,跳转到匹配的case结果,然后继续执行后续语句,直到遇到break结束执行。

格式:

switch(表达式)
{
case 常量表达式1:语句1;
....
case 常量表达式2:语句2;
default:语句;
}

注意:case 中的常量表达式仅支持:int,byte,char,short,其余不支持!!

请看下面的例子:

private static void test06() {
    int option = 2;//1代表游客,2代表微信,3代表QQ
    switch (option) {
        case 1:
            System.out.println("你好,您选择了游客登录");
        case 2:
            System.out.println("你好,您选择了微信登录");
        case 3:
            System.out.println("你好,您选择了QQ登录");
        default:
            System.out.println("你好,您没有选择登录方式");
    }

}

结果:

截图-1582623102

为什么它输出了三个?这就要涉及到下一个知识点:

一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break,利用这一特性可以让好几个case执行统一语句。

修改后的代码:

private static void test06() {
    int option = 2;//1代表游客,2代表微信,3代表QQ
    switch (option) {
        case 1:
            System.out.println("你好,您选择了游客登录");
            break;
        case 2:
            System.out.println("你好,您选择了微信登录");
            break;
        case 3:
            System.out.println("你好,您选择了QQ登录");
            break;
        default:
            System.out.println("你好,您没有选择登录方式");
            break;
    }

}

截图-1582623183

上面的switch,等价下面的if else if

if (option == 1) {
    System.out.println("你好,您选择了游客登录");
} else if (option == 2) {
    System.out.println("你好,您选择了微信登录");
} else if (option == 3) {
    System.out.println("你好,您选择了QQ登录");
} else {
    System.out.println("你好,您没有选择登录方式");
}

注意点:

  1. default就是如果没有符合的case就执行它,default并不是必须的.
  2. case后的语句可以不用大括号.
  3. 一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break,利用这一特性可以让好几个case执行统一语句.
  4. 如果case后面忘记了break,那么可能造成很大的逻辑错误。即使,有时我们需要专门使用这个特性。
  5. JDK1.7后,case 语句其实也支持字符串类型,但其本质仍是int类型的比较,通过对case后面的string对象调用hashcode()方法,得到一个int类型的hash值,然后用这个hash值来唯一标识这个case。

如下:

    String option = "QQ";//1代表游客,2代表微信,3代表QQ
    switch (option) {
        case "yk":
            System.out.println("你好,您选择了游客登录");
            break;
        case "wechat":
            System.out.println("你好,您选择了微信登录");
            break;
        case "QQ":
            System.out.println("你好,您选择了QQ登录");
            break;
        default:
            System.out.println("你好,您没有选择登录方式");
            break;

    }
}

4. do while / while循环

循环结构分两大类,一类是当型,一类是直到型。

当型:

当布尔值表达式条件为True时,反复执行某语句,当布尔表达式的值为False时才停止循环,例如:while 与 for循环。

直到型:

先执行一次某语句,在判断布尔表达式,如果为true,再执行某语句,如此反复,直到布尔表达式条件为false时才停止循环,例如do - while循环。

例如,计算从1到100的和:

while:

private static void test07() {
    int sum = 0; // 累加的和,初始化为0
    int n = 1;
    while (n <= 100) { // 循环条件是n <= 100
        sum = sum + n; // 把n累加到sum中
        n++; // n自身加1
    }
    System.out.println(sum); // 5050
}

do-while:

private static void test07() {
    int sum = 0; // 累加的和,初始化为0
    int n = 1;
    do {
        sum += n;
        n++;
    } while (n <= 100);
    System.out.println("sum = " + sum);
}

注:如上所示,在一些情况下,while和do while是可以相互替换的!


死循环:

当while的条件一直是真时,那么此时就造成了死循环:

private static void test08() {
    while (true) {
        System.out.println("Hello World");
    }
}

死循环将导致100%的CPU占用,用户会感觉电脑运行缓慢,所以要避免编写死循环代码。

当然,也不排除在某些情况下我们需要一些死循环,但这种情况极少,所以我们一定要避免编写死循环代码。

5. for循环

除了whiledo while循环,Java使用最广泛的是for循环。

for循环的功能非常强大,它使用计数器实现循环。for循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。计数器变量通常命名为i

例如之前的求和代码:

private static void test09() {
    int sum = 0;
    for (int i = 0; i <= 100; i++) {
        sum += i;
    }
    System.out.println("sum = " + sum);//5050
}

在实际开发中,其实更多人喜欢使用for而非while等,是因为for循环的循环次数更易控制,人的大脑更易理解。


for循环执行前,会先执行初始化语句int i=1,它定义了计数器变量i并赋初始值为1,然后,循环前先检查循环条件i<=100,循环后自动执行i++,因此,和while循环相比,for循环把更新计数器的代码统一放到了一起。在for循环的循环体内部,不需要去更新变量i

for (初始条件; 循环检测条件; 循环后更新计数器) {
    // 执行语句
}

实际执行次数:

在上面的代码中,看似我们执行力100次,这没错。

for (int i = 0; i <= 100; i++) {
}

但是我们可以在for循环内部更改i的值,所以就不一定能执行100次了!

private static void test09() {
    int sum = 0;
    for (int i = 0; i <= 100; i++) {
        sum += i;
        i += 1;//我们这里使i的值又加了1
    }
    System.out.println("sum = " + sum);//2550
}

其它for写法

// 不设置结束条件:
for (int i=0; ; i++) {
    ...
}
// 不设置结束条件和更新语句:
for (int i=0; ;) {
    ...
}
// 什么都不设置:
for (;;) {
    ...
}

for each(增强for循环)

前面其实我们已经说了增强for循环了,如下:

private static void test10() {
    int[] nums = {1, 4, 9, 79, 20};
    for (int n : nums) {
        System.out.println(n);
    }
}

和for循环相比,for each循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each循环的写法也更简洁。

但是,for each循环无法指定遍历顺序,也无法获取数组的索引。

6. break / continue

无论是while循环还是for循环,有两个特别的语句可以使用,就是break语句和continue语句。

break

在循环过程中,可以使用break语句跳出当前循环。

private static void test11() {
    for (int i = 0; i < 10; i++) {
        if (i > 5) {
            break;
        }
        System.out.print("i = " + i + "|");
        //i = 0|i = 1|i = 2|i = 3|i = 4|i = 5|
    }
}

特别注意,break语句总是跳出自己所在的那一层循环。例如:

private static void test11() {
    for (int i = 0; i < 10; i++) {

        System.out.println("i = " + i);
        for (int j = 0; j < 10; j++) {
            if (j > 5) {
                break;// break只跳出内层for循环,对于外面的不影响
            }
            System.out.println("j = " + j);
        }
    }
}

continue

break会跳出当前循环,也就是整个循环都不会执行了。而continue则是提前结束本次循环,直接继续执行下次循环。

private static void test12() {
    for (int i = 0; i < 10; i++) {
        if (i == 5) {
            continue;
        }
        System.out.print("i = " + i + "|");
        //i = 0|i = 1|i = 2|i = 3|i = 4|i = 6|i = 7|i = 8|i = 9|
    }
}

这里并没有输出5,因为该次循环跳过了!

本节阅读完毕! (分享
二维码图片 扫描关注我们哟