Java:关于跳出两层循环的方法以及Label(标签)

Java:关于跳出两层循环的方法以及Label(标签)

  • HR曾问过我这样一个问题:Java中,如何跳出两层循环?
  • 虽然当时没有说我的答案是错的,但也没完全认可。以下为对该问题的重新研究。

1. Label(标签)

  • 标签只能存在于 循环语句 中,且只能在循环的头部位置。
  • 标签的唯一作用:当 break 和 continue 配合标签使用后可以更好地控制循环的跳转以及中断。
  • 标签的形式(位置):
label:while (condition) {}

label:
for (condition){}
  • 在给出示例之前需要明确 break、 continue 以及 return 的意思。
    • break:终止当前循环,并跳出当前循环。
    • continue:终止当前循环的一条语句,并跳转至下一条语句。
    • return:结束当前方法。


示例一:(啥也没有)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test1();
    }
    private static void test1() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    //啥也没有
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }
    
}

结果一:(啥也没有)
在这里插入图片描述

示例二:(continue)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test2();
    }
    private static void test2() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    continue;//当j==1时,终止当前循环的这一条语句,跳转至下一条,即j==2时的语句。
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }
    
}

结果二:(continue)
在这里插入图片描述

示例三:(break)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test3();
    }

    private static void test3() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    break;//当j==1时,终止当前循环,并跳出当前循环。回到了上一级循环从i==1开始。
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }
    
}

结果三:(break)
在这里插入图片描述
示例四:(continue outerLoop)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test4();
    }

    private static void test4() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    continue outerLoop;//当j==1时,终止当前循环的这一条语句,跳转至外循环,并终止当前外循环的这一条语句(导致没有输出“换行”),从i==1开始。
                                //得到的数据与break相同,唯一的区别是没有输出换行,导致格式不同,结果都在同一行。
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }

}

结果四:(continue outerLoop)
在这里插入图片描述

示例五:(continue innerLoop)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test5();
    }

    private static void test5() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    continue innerLoop;//当j==1时,终止当前循环的这一条语句,跳转至内循环,并终止当前内循环的这一条语句(重复操作),从j==2开始。
                                //得到的结果与continue完全相同
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }
    
}

结果五:(continue innerLoop)
在这里插入图片描述

示例六:(break outerLoop)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test6();
    }

    private static void test6() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    break outerLoop;//当j==1时,终止当前循环,跳转至外循环,并终止当前外循环。
                            //该结果表明:已经跳出了两层循环。
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }

}

结果六:(break outerLoop)
在这里插入图片描述

示例七:(break innerLoop)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test7();
    }

    private static void test7() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    break innerLoop;//当j==1时,终止当前循环,跳转至内循环,并终止当前内循环(重复操作)。
                    //得到的结果与break完全相同。
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }
    
}

结果七:(break innerLoop)
在这里插入图片描述

示例八:(return)

package com.oop.demo01;

public class Loop {
    public static void main(String[] args) {
        test8();
    }

    private static void test8() {
        outerLoop:
        for (int i = 0; i < 3; i++){
            innerLoop:
            for (int j = 0; j < 3; j++){
                if (j==1){
                    return;//结束当前方法。
                    //得到的结果与break outerLoop完全相同(已通过其他测试验证了不存在格式不同问题)。该结果表明:已经跳出了两层循环。
                }
                System.out.print("i"+i+" j"+j+", ");//内循环结果出现在一行
            }
            System.out.println();//内循环结束后换行
        }
    }
    
}

结果八:(return)
在这里插入图片描述

结论:

  • 一共有八种类型如下:

    • 啥也没有 → 完全输出
    • continue → 终止当前循环的一条语句,并跳转至下一条语句。
    • break → 终止当前循环,并跳出当前循环。

    • continue outerLoop → 看似与break几乎相同,但会跳过与内循环平行的其他语句,例如示例中的换行语句System.out.println();//内循环结束后换行
    • continue innerLoop → 与continue完全相同。
    • break outerLoop → 终止当前循环,还能终止外层循环。
    • break innerLoop → 与break完全相同。

    • return → 结束当前方法。看似与break outerLoop完全相同,但会跳过与外循环平行的其他语句,示例中是由于没有平行语句才并未体现。

2. 如何跳出两层循环的答案

  • break outerLoop:
    • 给外循环加上 outerLoop: 的标签,在想要跳出的位置写上break outerLoop;
  • return:
    • 由于是直接结束了整个方法,自然也就跳出了该方法下所有的循环。

  • 2022年05月10日新增(瞎想):
  • 自然退出(?)
    • 等待所有循环结束,自然就退出了所有的循环。

  • 2022年07月01日新增(tip):
  • 由于用了 return 会跳过与循环语句平行的其他未执行语句,为了避免这种情况,可以将两层循环单独抽离成一个方法,在其他方法中进行调用即可。

PS: 在C/C++语言中,有一种goto语法,与break outerLoop语法相似。
示例:

#include<stdio.h>
int n=0;
int main(void) {
    printf("input a string: ");
        loop: if (getchar()!='\n') {
        n++;
        goto loop;
    }
  printf("output: %d\n",n);
}
  • 在C/C++语言中,goto语句常被用于跳出多层循环。但goto语句的使用往往会使程序的可读性降低,所以Java不允许goto跳转。在Java中,goto也是作为关键字被保留的,但这个关键字没有任何作用,只是为了将来可能的扩展,防止使用goto作为程序中的标识符。

 
 

—————— THE END ——————
 
  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zachsj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值