Java循环还能这么玩?

261 阅读3分钟

同事重温Java的时候看到了一段下面这样的代码,他问我知不知道这个是什么。时间久了,又不常用,这我可记不住,你能回想起来这是什么吗?

public class TagLoopTest {

    public static void main(String[] args) {

        outerLoop:
        for (int i = 1; i <= 3; i++) {
            System.out.println("Outer loop iteration: " + i);
            innerLoop:
            for (int j = 1; j <= 3; j++) {
                if (i == 2 && j == 2) {
                    // 跳出内层循环
                    System.out.println("Breaking inner loop at i=" + i + ", j=" + j);
                    continue innerLoop;
                }
                if (i == 3) {
                    // 跳出外层循环
                    System.out.println("Breaking outer loop at i=" + i);
                    break outerLoop;
                }
                System.out.println("Inner loop iteration: " + j);
            }
        }
        System.out.println("Loops completed.");
    }
}

即使可能回想不起来,但是代码的运行结果应该是能够猜出来的,运行结果如下,看看是否跟你猜想的一样。

Outer loop iteration: 1
Inner loop iteration: 1
Inner loop iteration: 2
Inner loop iteration: 3
Outer loop iteration: 2
Inner loop iteration: 1
Breaking inner loop at i=2, j=2
Inner loop iteration: 3
Outer loop iteration: 3
Breaking outer loop at i=3
Loops completed.

goto

学过C语言的网友可能会发现,这不就类似于C语言中的goto吗?的确是。可能有些人不熟悉goto语句,这里简单介绍一下。

在C语言中,goto 是一种控制流语句,它允许直接跳转到程序中的另一个位置。使用 goto 可以跳转到同一函数内的标记(标签)处,从而实现非常灵活的控制流程。然而,goto 语句在结构化编程理念中被视为一种不良实践,因为它可能导致程序结构混乱和难以理解,使得代码难以维护和调试。

goto label;

// 标签处
label: 
// 代码块

是不是跟上面的代码特别像,不同的是在Java中,goto不是关键字。

07D274F7.gif

好了,说了那么多了,该揭晓一下正主了。上面代码中的写法在Java中被称为带有标签的循环

带有标签的循环

带有标签的循环(也称为标签化循环) 是一种特殊的循环结构,它允许你使用 breakcontinue 关键字配合一个标识符(标签),从而更灵活地控制循环的执行流程,这种结构特别适用于多层嵌套循环的情况,比如可能需要从内层循环直接跳转到外层循环的特定点。。

语法

语法如下:

labelName: // 这里是标签
for (initialization; condition; increment) {
    // 循环体
    if (someCondition) {
        break labelName; // 使用标签的 break 语句跳出至指定的标签处
    }
    if (anotherCondition) {
        continue labelName; // 使用标签的 continue 语句跳回至指定的标签处并重新开始循环
    }
}

需要注意的是:

  • 标签可以是任意合法的标识符,但最好选择有意义的名称以便于代码阅读。标签后面要跟着一个冒号(:)。
  • 标签必须紧贴在循环语句之前,并且只能用于循环语句(forwhiledo-while)。

总结

虽然Java允许在循环语句前加上标签并使用 breakcontinue 语句来跳转到指定标签处,但这种做法通常被认为是一种不良的编码习惯,而且可能影响代码的可读性和维护性。所以实际工作中并不建议使用带有标签的循环 ,如果真的想使用了,优先考虑一下是否有替代或者重构代码。