`
1025250620
  • 浏览: 230418 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中循环嵌套跳出的高效写法

阅读更多
(下面写的这些并不是Jdk的新特性,也不是Java某个版本提供的语法糖,不过是java语言早就提供的书写技巧,但是却被一直忽略的技巧)
最近代码中总能用到循环嵌套的情况,大致模板如下:
forech1(..)
{
    forech2(...) {
        ...
        checkbreak1();
        ...
    }
    ...
    checkbreak2();
    ...
}
为了达到跳出循环forech1 的目的需要进行两个过程:checkbreak1和checkbreak2 ,问题在于checkbreak1 和checkbreak2这两个过程,他们的代码和逻辑结构非常相似。常常在做重复的工作。下面给出一个小demo大家大致能明白这个过程:
while (true)/*forech1*/ {
            int m = 10;
            while (m > 0) /*forech2*/ {
                m--;
                // >>> code1
                if (m == 4) {
                    break;
                }
                // <<< code1
            }
            // >>> code2
            if (m == 4) {
                break;
            }
            // <<< code2
}
我们可以看到跳出Forech1我们要重复写code2这段我们毫无用处的代码。如果遇到这种情况我们可以使用break Label,Label标签并不是新的特性,而且相信大家也非常熟知这个写法,但是可能跟我一样一直不知道什么时候用它合适。实际上遇到这种循环嵌套跳出的情况我们完全可以使用它,而且我也将向大家展示它的高效。我们在使用Label标签改造之后的代码就变成:
LABEL:while (true)/*forech1*/ {
            int m = 10;
            while (m > 0) /*forech2*/ {
                m--;
                // >>> code1
                if (m == 4) {
                    break LABEL;
                }
                // <<< code1
            }
}
我们可以看到我们在code1后直接跳转到LABEL的索引位置。代码结构更简洁,当然你可能毫不犹豫的脱口而出这不是goto的写法么?goto这种写法破坏结构化程序结构。。个人认为只要是你觉得用的爽,没有破坏大结构的情况下像那种教条是不用特别遵守的。
>>性能比较:
或许你也和我一样疑惑,这种写法是否会像jdk1.6提供的foreach一样是中看不中用呢?效率上比不上通过之前的索引方式。为了证明这点我们来看下这段代码最后所翻译出来的指令代码:
非label方式:
Code:
   21:  iload_1
   22:  iconst_4
   23:  if_icmpne       0
   26:  return
我们可以看到他在foreach2之后通过3条指令来完成跳转判断.实际上这种测试是由你的code2的代码复杂性来决定的。
===
label方式:
Code:
   21:  goto    0
   26:  return
我们看到通过label方式只用了一条高效的goto指令就完成了跳转。也就是说在虚拟机看来label方式要比非label方式高效的多。
>>内存比较:
其实通过非label方式产生比较多的字节码,已经能代表其占用的内存空间。但是可能有人会吹毛求疵的说你定义一个Label需要往常量池中多定义个数据。其实我可以告诉你这种定义是没有的,我们打印出它的常量池(我这里就不打印了 (抠鼻)),你应该是找不到你的Label这个常量的。因为在编译的时候已经预编译成了索引。

注:当然为了实现从foreach2跳到foreach1有很多种方法,你一样可以采用异常的方式,但是异常的方式需要专门构建异常表,而且效率不高,所以还是提倡采用label的方式来进行跳出。当然你还沿用之前的写法也无伤大雅。
0
1
分享到:
评论

相关推荐

    java基础.doc

    在Java中,如果需要从多层嵌套循环中提前退出,可以通过以下两种方式实现: - **使用标签(Label)**:在外部循环前定义一个标签,然后在内层循环中使用带标签的`break`语句来跳出循环。例如: ```java outerLoop:...

    Java面试宝典2011最新版

    这种写法主要用于复杂的嵌套循环结构中,便于控制多层循环的退出。 示例: ```java outerLoop: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { System.out.println("i=" + i + ", j=" + j); if (j == 5...

    Java面试宝典2012版

    4. **跳出多重嵌套循环** - 可以通过定义标签来跳出特定的循环层,例如: ```java label: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { if (i == 5 && j == 5) { break label; // 跳出整个循环 }...

    java面试资料2019

    跳出多重嵌套循环 - 使用`break`语句只能跳出最近一层循环。 - 可以通过定义一个标记(label)来实现跳出多层循环,例如: ```java outerLoop: for (int i = 0; i ; i++) { innerLoop: for (int j = 0; j ; j++)...

    Java语言程序设计教程.ppt

    在教程中,提到了循环嵌套和无穷循环的概念,以及如何使用`break`和`continue`语句来控制循环的执行。`break`用于跳出当前循环,而`continue`则跳过当前迭代的剩余部分,继续下一轮迭代。 `switch`语句是另一种条件...

    Java面试宝典2011版.

    《Java面试宝典2011版》涵盖了Java面试中常见的各类问题,旨在帮助准备面试的程序员们系统地复习和掌握Java的核心知识和技术要点。以下是对文档标题、描述及部分内容中提到的关键知识点的深入解析: ### Java基础...

    java面试宝典2012版

    可以通过标签(label)来实现跳出多重嵌套循环。首先为最外层的循环添加一个标签,然后使用break语句配合标签名来跳出循环。 5. switch语句能否作用在byte、long、String上? 在Java中,switch语句可以作用于byte...

    Java面试宝典2010版

    ##### 4、在JAVA中如何跳出当前的多重嵌套循环? - **答案**:可以使用`break`语句加上标签来跳出多重嵌套循环。 - **示例**: ```java outerLoop: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { if...

    Java面试葵花宝典2012版

    在Java中,可以通过定义标签来标记外层循环,然后使用`break`加上标签名称来跳出指定的循环层次。例如: ```java outer: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { if (i == 5 && j == 5) { break...

    Java面试题

    在 Java 中,可以通过以下方式来跳出多重嵌套循环: - 使用传统的 `break` 语句,这会跳出最近的内层循环。 - 使用带有标签的 `break` 语句,例如 `labelName: for (…) { … break labelName; }`,这将跳出带有所需...

    Java程序员面试宝典2011最新出炉

    4. **跳出多重嵌套循环**:在Java中,可以使用`break`语句配合标签(label)来跳出多重嵌套循环。例如,`break label;`会跳出标记为`label`的循环。 5. **`switch`语句的适用范围**:`switch`语句可以作用于`byte`,...

    java 面试宝典

    在 Java 中如何跳出当前的多重嵌套循环?** 可以通过使用 `break` 语句结合带标签的循环来跳出多重循环。例如: ```java outer: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { if (i == 5 && j == 5)...

    java 程序员面试常见题目

    在Java中,可以使用 `break` 语句配合标签(label)跳出多重嵌套循环。例如: ```java outerLoop: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { if (i == 5 && j == 5) { break outerLoop; } } } `...

    java面试宝典

    在 JAVA 中如何跳出当前的多重嵌套循环?** 为了跳出多重嵌套循环,可以使用带有标签的 `break` 语句。例如,可以在外层循环前添加一个标签,然后使用 `break` 后跟该标签来跳出所有的内层循环。 **5. switch ...

    JAVA面试宝典-准备成功

    在Java中,可以通过使用`break`语句配合标签(label)来跳出多重嵌套循环。例如: ```java outerLoop: for (int i = 0; i ; i++) { for (int j = 0; j ; j++) { if (i == 5 && j == 5) { break outerLoop; } }...

    面试题经典

    在Java中跳出多重嵌套循环可以通过以下两种方式实现: - 使用`break`语句加上外部循环的标签:通过给外层循环添加一个标签,并在内层循环中使用`break label`的形式来跳出整个循环。 - 使用`return`语句:如果循环...

Global site tag (gtag.js) - Google Analytics