java中的嵌套循环原理,Java中循环嵌套跃出的高效写法

当前位置:我的异常网» 编程 » Java中循环嵌套跃出的高效写法

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

www.myexceptions.net  网友分享于:2014-04-29  浏览:2次

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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值