`
1025250620
  • 浏览: 225635 次
  • 性别: 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程序设计基础:嵌套循环.pptx

    循环结构设计 --嵌套循环 目录 课程导入 掌握嵌套循环的使用场合及语法 能够使用嵌套循环完成程序的编写 嵌套循环:一个循环作为另外一个循环的循环体。循环中包含了其他的循环。外层的循环称为外循环,内层的循环称...

    java跳出循环break;return;continue使用

    java跳出循环break;return;continue使用 . java跳出循环break;return;continue使用 . java跳出循环break;return;continue使用

    Java跳出多重嵌套循环代码实例

    主要介绍了Java跳出多重嵌套循环,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    在Java中如何跳出当前的多重嵌套循环?

    在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如: ok: for(int i=0;i&lt;10;i++) { for(int j=0;j&lt;10;j++) ...

    Java跳出多重嵌套循环过程解析

    主要介绍了Java跳出多重嵌套循环过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java跳出多重嵌套循环

    在java里面,我们知道有goto这个关键字,但是实际却没有啥作用,这让我们不像在c/c++里面能够随便让程序跳到那去执行,而break只能跳出当前的一个循环语句,如果要跳出多个循环体那么该怎么办呢。  我们可以这样...

    跳出while无限循环嵌套下的switch语句

    while无限循环嵌套下的switch语句选择应该使用什么才能够跳出while(true)下的无限循环

    Java 跳出递归循环问题解决办法

    主要介绍了 Java 跳出递归循环问题解决办法的相关资料,需要的朋友可以参考下

    java实验3.3(循环显示数字,在5的时候跳出循环)

    Write a Java program called BreakLoop.java that uses a for loop with the variable "count" and count 1 to 10.. Display "count=&lt;count&gt;" each time you loop through. Break out of the loop at 5. At the end...

    JAVA多层IF嵌套-判断闰年及日期是否正确

    结合实际生活,有助于初学者进一步了解JAVA的IF循环语句

    Delphi 跳出循环的几种方法

    跳出本模块(过程和函数),放在循环中是跳出循环在所在的模块。 【abort】 中止程序的运行,产生不报错的异常信息。跳出祖先模块。和【exit】的区别是 procedure p1; begin p2; p3; end; procedure p2; begin ...

    python基础教程:在Python的while循环中使用else以及循环嵌套的用法

    这篇文章主要介绍了在Python的while循环中使用else以及循环嵌套的用法,是Python入门学习中的基础知识,需要的朋友可以参考下 循环使用 else 语句 在 python 中,for … else 表示这样的意思,for 中的语句和普通的...

    JAVA阶段模拟试题

    1给定如下Java程序,编译运行时,将在()出现错误。(选一项) public class Test{ public static void main...B从嵌套循环内部跳出最里面的循环 C终止switch语句的语句序列,提高switch-case语句性能 D退出循环

    java内部测试题

    java内部测试题

    break的使用for循环嵌套示例

    主要介绍了break的使用for循环嵌套示例,需要的朋友可以参考下

    Java中有没有goto关键字

    Java中有goto关键字吗? 答案是有的,goto是java保留关键字,但是不能使用。 在哪里有应用? 在C语言中goto一般配合条件语句,可用来实现条件转移,形成循环,跳出循环等。 注:java的底层是C,goto是java的保留字

    java常见面试100题

    5. 在JAVA中如何跳出当前的多重嵌套循环? 7 6. switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 8 7. short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 8 8. char型变量...

    java基础知识-for循环的使用

    在Java中,for循环是一种常用的迭代结构,用于重复执行相同的代码块。 for循环由三个部分组成: 1、初始化表达式:在循环开始之前执行一次,通常用于初始化循环变量。 2、条件表达式:在每次迭代之前进行判断,如果...

    Java面试宝典2017

    在JAVA 中,如何跳出当前的多重嵌套循环?【基础】 答:在最外层循环前加label 标识,然后用break:label 方法即可跳出多重循环。

    java面试过程当中遇到的一些题目

    5. 在JAVA中,如何跳出当前的多重嵌套循环? 10 6. 什么是java序列化,如何实现java序列化?(写一个实例) 10 7. 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 10 8. 排序都有哪几种方法?请...

Global site tag (gtag.js) - Google Analytics