• 读书笔记-《ON JAVA 中文版》-摘要4


    第五章 控制流

    1. true 和 false

    所有的条件语句都利用条件表达式的“真”或“假”来决定执行路径。

    2. if-else

    if-else 语句是控制程序执行流程最基本的形式。 其中 else 是可选的,因此可以有两种形式的 if 。代码示例:

    if(Boolean-expression) 
    	“statement” 
    
    • 1
    • 2

    if(Boolean-expression) 
    
    	“statement” 
    
    else
    
    	“statement” 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    布尔表达式(Boolean-expression)必须生成 boolean 类型的结果,执行语句 statement 既可以是以分号 ; 结尾的一条简单语句,也可以是包含在大括号 {} 内的的复合语句 —— 封闭在大括号内的一组简单语句。

    —PS:还是写大括号 {} 吧,结构更清晰些

    else if 并非新关键字,它仅是 else 后紧跟的一条新 if 语句。

    —PS:if-else if-else if-else if------else,你看你也吐

    3. 迭代语句

    whiledo-whilefor 用来控制循环语句(有时也称迭代语句)。只有控制循环的布尔表达式计算结果为 false ,循环语句才会停止。

    while

    while 循环的形式是:

    while(Boolean-expression) 
    	statement
    
    • 1
    • 2

    执行语句会在每一次循环前,判断布尔表达式返回值是否为 true 。

    do-while

    do-while 的格式如下:

    do 
        statement 
    while(Boolean-expression);
    
    • 1
    • 2
    • 3

    whiledo-while 之间的唯一区别是:即使条件表达式返回结果为 false , do-while 语句也至少会执行一次。 在 while 循环体中,如布尔表达式首次返回的结果就为 false ,那么循环体内的语句不会被执行。实际应用中,while 形式比 do-while 更为常用。

    —PS:do-while 是先干了再说

    for

    for 循环可能是最常用的迭代形式。 该循环在第一次迭代之前执行初始化。随后,它会执行布尔表达式,并在每次迭代结束时,进行某种形式的步进。for 循环的形式是:

    for(initialization; Boolean-expression; step) 
    	statement 
    
    • 1
    • 2

    初始化 (initialization) 表达式、布尔表达式 (Boolean-expression) ,或者步进 (step) 运算,都可以为空。每次迭代之前都会判断布尔表达式的结果是否成立。一旦计算结果为 false ,则跳出 for 循环体并继续执行后面代码。 每次循环结束时,都会执行一次步进。

    —PS:fori

    for 循环的初始化和步进控制中定义多个变量。我们可以使用逗号分隔多个语句,并按顺序计算这些语句。注意:要求定义的变量类型相同。代码示例:

    public class CommaOperator { 
        public static void main(String[] args) { 
            for(int i = 1, j = i + 10; i < 5; i++, j = i * 2) {           
               System.out.println("i = " + i + " j = " + j); 
            } 
        } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    输出结果:

    i = 1 j = 11 
    i = 2 j = 4 
    i = 3 j = 6 
    i = 4 j = 8
    
    • 1
    • 2
    • 3
    • 4

    无论在初始化还是在步进部分,语句都是顺序执行的。

    —PS:这种我是没用到过

    4. for-in 语法

    Java 5 引入了更为简洁的“增强版 for 循环”语法来操纵数组和集合。

    for-in 无需你去创建 int 变量和步进来控制循环计数。

    代码示例:

    for(float x : f) { }
    
    • 1

    for-in 语法可以节省我们编写代码的时间。 更重要的是,它提高了代码可读性以及更好地描述代码意图(获取数组的每个元素)而不是详细说明这操作细节(创建索引,并用它来选择数组元素) 本书推荐使用 for-in 语法。

    —PS:确实好使

    5. return

    return 关键字有两方面的作用:

    1. 指定一个方法返回值 (在方法返回类型非 void 的情况下);

    2. 退出当前 方法,并返回作用 1 中值。

    如果在方法签名中定义了返回值类型为 void,那么在代码执行结束时会有一个隐式的 return。 也就是说我们不用在总是在方法中显式地包含 return 语句。 注意:如果你的方法声明的返回值类型为非 void 类型,那么则必须确保每个代码路径都返回一个值。

    6. break 和 continue

    在任何迭代语句的主体内,都可以使用 breakcontinue 来控制循环的流程。 其中,break 表示跳出当前循环体。而 continue 表示停止本次循环,开始下一次循环。

    —PS:迭代语句-while do-while for

    7. 臭名昭著的 goto

    goto 起源于汇编(assembly language)语言中的程序控制:“若条件 A 成立,则跳到这里;否则跳到那里”。

    一个源码级别跳转的 goto,为何招致名誉扫地呢?若程序总是从一处跳转到另一处,还有什么办法能识别代码的控制流程呢?

    —PS:反复横跳

    尽管 goto 仍是 Java 的一个保留字,但其并未被正式启用。可以说, Java 中并不支持 goto

    —PS:不好吃那就别吃了

    在这里插入图片描述

    然而,在 breakcontinue 这两个关键字的身上,我们仍能看出一些 goto 的影子。它们并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入 goto 问题中一起讨论,是由于它们使用了相同的机制:标签。

    “标签”是后面跟一个冒号的标识符。代码示例:

    label1:
    
    • 1

    breakcontinue 关键字通常只中断当前循环,但若搭配标签一起使用,它们就会中断并跳转到标签所在的地方开始执行。代码示例:

    label1: 
    outer-iteration { 
        inner-iteration { 
            // ... 
            break; // [1] 
            // ... 
            continue; // [2] 
            // ... 
            continue label1; // [3] 
            // ...
            break label1; // [4] 
        } 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    [1] break 中断内部循环,并在外部循环结束。

    [2] continue 移回内部循环的起始处。但在条件 3 中,continue label1 却同时中断内部循环以及外部循环,并移至 label1 处。

    [3] 随后,它实际是继续循环,但却从外部循环开始。

    [4] break label1 也会中断所有循环,并回到 label1 处,但并不重新进入循环。也就是说,它实际是完全中止了两个循环。

    大家要记住的重点是:在 Java 里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中 breakcontinue

    —PS:标签的使用概率很低,知道有这么个东西就行,反复横跳容易懵逼

    8. switch

    switch 有时也被划归为一种选择语句。根据整数表达式的值,switch 语句可以从一系列代码中选出一段去执行。它的格式如下:

    switch(integral-selector) { 
        case integral-value1 : statement; break; 
        case integral-value2 : statement; break; 
    	case integral-value3 : statement; break; 
    	case integral-value4 : statement; break; 
    	case integral-value5 : statement; break; 
    	// ... 
    	default: statement; 
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    其中,integral-selector (整数选择因子)是一个能够产生整数值的表达式,switch 能够将这个表达式的结果与每个 integral-value (整数值)相比较。若发现相符的,就执行对应的语句(简单或复合语句,其中并不需要括号)。若没有发现相符的,就执行 default 语句。

    在上面的定义中,大家会注意到每个 case 均以一个 break 结尾。这样可使执行流程跳转至 switch 主体的末尾。这是构建 switch 语句的一种传统方式,但 break 是可选的。若省略 break, 会继续执行后面的 case 语句的代码,直到遇到一个 break 为止。

    选择因子必须是 intchar 那样的整数值。对于非整数类型(Java 7 以上版本中的 String 型除外),则必须使用一系列 if 语句。

    —PS:想起了被 if-else 支配的恐惧

    9. switch 字符串

    Java 7 增加了在字符串上 switch 的用法。

    public class StringSwitch {
        public static void main(String[] args) {
            String color = "red";
            // 老的方式: 使用 if-then 判断 
            if ("red".equals(color)) {
                System.out.println("RED");
            } else if ("green".equals(color)) {
                System.out.println("GREEN");
            } else if ("blue".equals(color)) {
                System.out.println("BLUE");
            } else if ("yellow".equals(color)) {
                System.out.println("YELLOW");
            } else {
                System.out.println("Unknown");
            }
            // 新的方法: 字符串搭配 switch 
            switch (color) {
                case "red":
                    System.out.println("RED");
                    break;
                case "green":
                    System.out.println("GREEN");
                    break;
                case "blue":
                    System.out.println("BLUE");
                    break;
                case "yellow":
                    System.out.println("YELLOW");
                    break;
                default:
                    System.out.println("Unknown");
                    break;
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述

  • 相关阅读:
    【JAVA秘籍功法篇-SpringBoot】SpringBoot如何集成Redis?
    内存可见性问题
    [黑马程序员Pandas教程]——Pandas数据类型
    【OpenCV】Chapter5.空间域图像滤波
    Zfile-轻量开源个人网盘【超简单部署】
    挖掘数据价值,华为云大数据BI解决方案有绝招
    宏任务、微任务,怎么执行的
    【easycode】使用idea上的easycode生成DO
    C. Strange Test(位运算或)
    MasaFramework -- 锁与分布式锁
  • 原文地址:https://blog.csdn.net/JustDI0209/article/details/126647559