day3 3 java流程控制语句中的一些注意事项

3 流程控制语句

3.1 for each实现for的简化遍历集合

foreach 循环语句是 Java 1.5 的新特征之一,在遍历数组、集合方面,foreach 为开发者提供了极大的方便。foreach 循环语句是 for 语句的特殊简化版本,主要用于执行遍历功能的循环。
foreach 循环语句的语法格式如下:

for(类型 变量名:集合) {//注意有个冒号:
    语句块;
}

其中,“类型”为集合元素的类型,“变量名”表示集合中的每一个元素,“集合”是被遍历的集合对象或数组。每执行一次循环语句,循环变量就读取集合中的一个元素,其执行流程如图 1 所示。
在这里插入图片描述
例子演示:

// 声明并初始化int数组
int[] numbers = { 43, 32, 53, 54, 75, 7, 10 };
System.out.println("----for each----");
// for-each语句
for (int item : numbers) {
    System.out.println("Count is:" + item);
}

item 不是循环变量,它保存了集合中的元素,for-each 语句将集合中的元素一一取出来,并保存到 item 中,这个过程中不需要使用循环变量,通过数组下标访问数组中的元素。可见 for-each 语句在遍历集合的时候要简单方便得多。
注意事项:

  1. 使用 foreach 循环迭代数组元素时,并不能改变数组元素的值,因此不要对 foreach 的循环变量进行赋值。当使用 foreach 来迭代访问数组元素时,foreach 中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值。
  2. foreach 循环和普通循环不同的是,它无须循环条件,无须循环迭代语句,这些部分都由系统来完成,foreach 循环自动迭代数组的每个元素,当每个元素都被迭代一次后,foreach 循环自动结束。

3.2 break的新用法

在 Java 中,break 语句有 3 种作用,分别是:在 switch 语句中终止一个语句序列、使用 break 语句直接强行退出循环和使用 break 语句实现 goto 的功能。
使用 break 语句实现 goto 的功能(break 带标签)
有时候,在嵌套很深的循环语句中会发生一些不可预料的事情。此时可能更加希望跳到嵌套的所有循环语句之外。通过添加一些额外的条件判断实现各层循环的检测很不方便。

幸运的是,Java 与 C++ 不同,Java 提供了一种带标签的 break 语句,用于跳出多重嵌套的循环语句。

break 语句可以实现 goto 的功能,并且 Java 定义了 break 语句的一种扩展形式来处理退出嵌套很深的循环这个问题。

通过使用扩展的 break 语句,可以终止执行一个或者几个任意代码块,这些代码块不必是一个循环或一个 switch 语句的一部分。同时这种扩展的 break 语句带有标签,可以明确指定从何处重新开始执行。

break 除了具有 goto 退出深层循环嵌套作用外,还保留了一些程序结构化的特性。

标签 break 语句的通用格式如下:

break label;

label 是标识代码块的标签。当执行这种形式的 break 语句时,控制权被传递出指定的代码块。被加标签的代码块必须包围 break 语句,但是它不需要直接包围 break 的块。也就是说,可以使用一个加标签的 break 语句来退出一系列的嵌套块,但是不能使用 break 语句将控制权传递到不包含 break 语句的代码块。

用标签(label)可以指定一个代码块,标签可以是任何合法有效的 Java 标识符,后跟一个冒号。加上标签的代码块可以作为 break 语句的对象,使程序在加标签的块的结尾继续执行。

下面是使用带标签的break 语句的示例。

public class GotoDemo {
    public static void main(String[] args) {
        label: for (int i = 0; i < 10; i++) {//label里面必须有循环及break
            for (int j = 0; j < 8; j++) {
                System.out.println(j);
                if (j % 2 != 0) {
                    break label;//此时的break可以跳出多层循环,这里跳出外面的for
                }
            }
        }
    }
}

以上程序的执行结果为:

0
1

这里的 label 是标签的名称,可以为 Java 语言中任意合法的标识符。标签语句必须和循环匹配使用,使用时书写在对应的循环语句的上面,标签语句以冒号结束。如果需要中断标签语句对应的循环,可以采用 break 后面跟标签名的方式。

如在上面代码中,当 j 为 1 时,“j%2!=0”条件表达式成立,则 label 标签所代表的最外层循环终止。

注意:通常紧跟 break 之后的标签,必须在 break 所在循环的外层循环之前定义才有意义。
注意:一个循环中可以有一个以上的 break 语句,但是过多的 break 语句会破坏代码结构。switch 循环语句中的 break 仅影响 switch 语句,不会影响循环。

3.3 continue及标签

有时强迫一个循环提早反复是有用的,也就是,你可能想要继续运行循环,但是要忽略这次重复剩余的循环体的语句,所以 Java 提供了 continue 语句。continue 语句是 break 语句的补充。

与 break 语句一样, 它将中断正常的控制流程。continue 语句将控制转移到最内层循环的首部。

continue 语句是跳过循环体中剩余的语句而强制执行下一次循环,其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。

continue 语句类似于 break 语句,但它只能出现在循环体中。它与 break 语句的区别在于:continue 并不是中断循环语句,而是中止当前迭代的循环,进入下一次的迭代。简单来讲,continue 是忽略循环语句的当次循环。

注意:continue 语句只能用在 while 语句、for 语句或者 foreach 语句的循环体之中,在这之外的任何地方使用它都会引起语法错误。

在循环体中使用 continue 语句有两种方式可以带有标签,也可以不带标签。语法格式如下:

continue //不带标签
continue label //带标签,label是标签名

下面看一个示例,代码如下:

int[] numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i < numbers.length; i++) {
    if (i == 3) {
        continue;
    }
    System.out.println("Count is: " + i);
}

在上述程序代码中,当条件 i==3 的时候执行 continue 语句,continue 语句会终止本次循环,循环体中 continue 之后的语句将不再执行,接着进行下次循环,所以输出结果中没有 3。程序运行结果如下:

Count is: 0
Count is: 1
Count is: 2
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9

带标签的 continue 语句示例代码如下:

public static void main(String[] args) {
    label1: for (int x = 0; x < 5; x++) {
        for (int y = 5; y > 0; y--) {
            if (y == x) {
                continue label1;
            }
            System.out.println(x+","+y);
        }
    }
    System.out.println("Game Over!");
}

默认情况下,continue 只会跳出最近的内循环(代码第 3 行的 for 循环),如果要跳出代码第 2 行的外循环,可以为外循环添加一个标签 label1,然后在第 5 行的 continue 语句后面指定这个标签 label1,这样当条件满足执行 continue 语句时,程序就会跳转出外循环。准确点说是默认忽略当次的最近内循环,但是加了label可以指定忽略哪一个循环

程序运行结果如下:

0,5
0,4
0,3
0,2
0,1
1,5
1,4
1,3
1,2
2,5
2,4
2,3
3,5
3,4
4,5
Game Over!

由于跳过了 x == y,因此下面的内容没有输出。

1,1
2,2
3,3
4,4
发布了93 篇原创文章 · 获赞 65 · 访问量 5479

猜你喜欢

转载自blog.csdn.net/qq_44861675/article/details/105316200
今日推荐