在Java中如何从一个多层嵌套循环中直接跳出?

简介: 在Java中如何从一个多层嵌套循环中直接跳出?

 image.gif编辑

 

一、问题描述

最近发现一个有趣的问题,在Java中如何从一个多层嵌套循环中退出呢?

例如下面,有两层循环,break只能退出第一个for循环,不能直接跳出第二个for循环外面。

public static void main(String[] args) {
        for (String s1: sArray1) {
            for (String s2 : sArray2) {
                if (某个条件){
                    // 执行事件后退出
                    break;
                    // 这样只退出了最里的for循环
                }
            }
        }
    }

image.gif

二、解决方案

那该怎么解决这个问题呢?答案是可以用break+label的语法,例子如下:

public class test {
    public static void main(String[] args) {
        String[] s1={"1","2","3","4","5"};
        String[] s2={"6","7","8","9","10"};
        loop:for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (j > 2) {
                    System.out.println("使用break退出循环");
                    break loop;
                }
                System.out.println(i+"---"+j);
            }
        }
        System.out.println("执行结束");
    }
}

image.gif

首先在for循环前加标签,如例子中的loop,然后在for循环内break label(如本例的loop),就会跳出该label指定的for循环。

当然,这种方案小伙伴们见的比较少,我们也可以采用return的方式退出循环。

public class test {
    public static void main(String[] args) {
        String[] s1={"1","2","3","4","5"};
        String[] s2={"6","7","8","9","10"};
        for (int i = 0; i < s1.length; i++) {
            for (int j = 0; j < s2.length; j++) {
                if (j > 2) {
                    System.out.println("使用return退出循环");
                    return;
                }
                System.out.println(i+"---"+j);
            }
        }
        System.out.println("执行结束");
    }
}

image.gif

但使用return和使用break是有区别的,return后就不会继续执行后面的代码了,而使用break只是跳出循环,后面的代码还是会继续去执行。

所以最后一段代码的执行结束部分不会被执行。

三、goto关键字

这种break的方式,其实类似于c语言中的goto语法,比如下面的代码:

#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);
}

image.gif

在C/C++中,goto常被用于跳出多重循环。但goto 语句的使用往往会使程序的可读性降低,所以 Java 不允许 goto 跳转。在Java中,goto也是作为关键字被保留的,但这个关键字没有任何作用,只是为了将来可能的扩展,防止使用goto作为程序中的标识符。

四、Java中的标签

我们前面使用使用"break loop;"的方式跳出多重循环,实际上loop是Java的自定义自定义标签,Java 中的标签是为循环设计的,是为了在多重循环中方便的使用 break 和 coutinue 而设计的。(这也是Java中唯一用到标签的地方!)正是由于这个原因,Java 的标签只能定义在三种循环 (for() {}, do{} while(), while() {}) 的开始位置,否则编译器会报告说找不到标签。

在循环前面加上标签,就好像给循环起了个名字。而后在循环中使用 break 或者 continue 语句的时候,就可以带上这个标签做为参数,指明跳出 (break) 或者继续 (continue)标签对应的哪个循环,如"break mylabel;"、"continue mylabel;"。

五、总结

虽然break/continue+标签的用法平时很少见到,但在Java的源码中不时会看到,如在ThreadPoolExecutor类中的addWorker方法就使用了"continue 标签"。因此这也是Java程序设计的一种技巧,需要加以掌握。

相关文章
|
1月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中stream API与传统for循环在性能上的对比,通过多个示例分析了不同场景下两者的优劣。作者指出,尽管stream API使代码更简洁,但不当使用会降低可读性和性能,特别是在处理大数据量时。实验结果显示,在多数情况下,普通for循环的性能优于stream API,尤其是在单次操作耗时较短但需多次执行的场景中。文章建议开发者在设计初期就考虑全局流程,避免重复使用stream流,以提升代码质量和性能。
Java循环操作哪个快?
|
1月前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
4月前
|
存储 Java
|
2月前
|
算法 Java 测试技术
🧑‍💻Java零基础:Java 的循环退出语句 break
【10月更文挑战第16天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
64 6
|
3月前
|
Java
java基础(2)循环语句for、while、do...while
本文介绍了Java中的基础循环语句,包括for循环、while循环和do...while循环。文章通过示例代码展示了for循环的基本结构和用法,while循环的先判断后执行逻辑,以及do...while循环的先执行后判断逻辑。这些循环语句在Java编程中非常常用,用于执行重复的任务。
59 4
java基础(2)循环语句for、while、do...while
|
2月前
|
Java 测试技术 数据安全/隐私保护
📖Java零基础-while循环语句的深度解析
【10月更文挑战第6天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
46 1
|
2月前
|
传感器 Java 测试技术
📖Java零基础-do-while循环语句的深入剖析
【10月更文挑战第5天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
39 1
|
3月前
|
Java
Java循环
Java循环
47 6
|
3月前
|
编译器
Java--for循环语句
Java--for循环语句
|
4月前
|
存储 Java
如何在 Java 中循环 ArrayList
【8月更文挑战第23天】
49 2