当前位置: 首页 > 后端技术 > Java

为什么在有for(;;)时需要while(true)?哪个更快?

时间:2023-04-01 18:46:19 Java

作者:RednaxelaFX\链接:zhihu.com/question/52311366/answer/130090347在JDK8u的jdk工程下粗略搜索一下:mymbp:/Users/me/workspace/jdk8u/jdk/src$egrep-nr"for\\(\\s?;\\s?;".|wc-l369mymbp:/Users/me/workspace/jdk8u/jdk/src$egrep-nr"while\\(true".|wc-l323也差不了多少,其次,Java中for(;;)的来源,我个人的看法是,喜欢用这种写法的人,是受到了C语言写法的影响,这些人不一定是自己以前也是这样写C的,不过可能是受到以前写C的老师和前辈的间接影响,C语言如果不包含一些头文件或者自己声明,是没有内置的bool/bool类型,并且不存在TRUE/FALSE/true/false等Bool/bool类型值的字面量。因此,假设没有include头文件或者自己定义以上字面量,一个不写while(...)中的循环条件括号中最常见的while语句是这样的:while(1){/*...*/}但并不是每个人都喜欢看到幻数“1”。用for(;;)表达很直观,不用写循环条件(就是循环体内没有break或者goto,就会死循环)。这是for语句本身的作用,不需要写什么magicnumber。所以,这种写法一直流传下来,顺便说一句,我在Java中倾向于写while(true),但我不介意别人在自己的项目中写for(;;)。至于(;;)和在Java中(true),哪个更快?这种问题在规范中没有具体说明。答案是“取决于实施”。毕竟实现只需要保证语义符合规范即可,效率不在规范范围之内。看Oracle/SunJDK8u/OpenJDK8u的实现,先看javac对下面两条语句的编译结果:publicvoidfoo(){inti=0;while(true){i++;}}/*publicvoidfoo();代码:stack=1,locals=2,args_size=10:iconst_01:istore_12:iinc1,15:goto2*/andpublicvoidbar(){inti=0;对于(;;){i++;}}/*publicvoidbar();Code:stack=1,locals=2,args_size=10:iconst_01:istore_12:iinc1,15:goto2*/即使javac几乎优化了一个编译器,两者都不做(只做必须做的常量折叠如Java语言规范中规定的,以及极少量的其他优化)为上述两个版本的代码生成相同的字节码。不用说了,后面还有解释执行,JIT编译等等。输入相同,输出不会不同。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.6正式发布,一大波新特性。.5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!