有了 for (;;) ,为什么还需要while (true) ? 到底哪个更快?

Java后端技术

共 1824字,需浏览 4分钟

 ·

2021-11-28 16:19

往期热门文章:

1、史记 · 码农列传

2、IDEA 注释模板这样搞!爽!

3、为什么国内 996 干不过国外的 955 呢?

4、在部队当程序员是什么体验?

5、神级程序员都在用什么工具?

来源:zhihu.com/question/52311366/answer/130090347

在JDK8u的jdk项目下做个很粗略的搜索:

mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for \\(\\s?;\\s?;" . | wc -l 369mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "while \\(true" . | wc -l323
并没有差多少。

其次,for (;;) 在Java中的来源。个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响。这些人不一定是自己以前写C习惯了这样写,而可能是间接受以前写C的老师、前辈的影响而习惯这样写的。

在C语言里,如果不include某些头文件或者自己声明的话,是没有内建的Bool / bool类型,也没有TRUE / FALSE / true / false这些Bool / bool类型值的字面量的。所以,假定没有include那些头文件或者自己define出上述字面量,一个不把循环条件写在while (...)括号里的while语句,最常见的是这样:
while (1) {/* ... */ }

但不是所有人都喜欢看到那个魔数“1”的。而用for (;;)来表达不写循环条件(也就是循环体内不用break或goto就会是无限循环)则非常直观,这就是for语句本身的功能,而且不需要写任何魔数。

所以,这个写法就流传下来了。

顺带一提,在Java里我是倾向于写while (true)的,不过我也不介意别人在他们自己的项目里写for (;;)。

至于Java里的for (;;)与while (true),哪个更快?

这种规范没有规定的问题,答案都是“看实现”,毕竟实现只要保证语义符合规范就行了,而效率并不在规范管得着的范畴内。以Oracle/Sun JDK8u / OpenJDK8u的实现来看,首先看javac对下面俩语句的编译结果:
public void foo() {int i = 0;while (true) { i++; }}
/*public void foo();Code:stack=1, locals=2, args_size=10: iconst_01: istore_12: iinc 1, 15: goto 2*/
public void bar() {int i = 0;for (;;) { i++; }}
/*public void bar();Code:stack=1, locals=2, args_size=10: iconst_01: istore_12: iinc 1, 15: goto 2*/

连javac这种几乎什么优化都不做(只做了Java语言规范规定一定要做的常量折叠,和非常少量别的优化)的编译器,对上面俩版本的代码都生成了一样的字节码。

后面到解释执行、JIT编译之类的就不用说了,输入都一样,输出也不会不同。

往期热门文章:

1、历史文章分类导读列表!精选优秀博文都在这里了!》
2、Spring Boot + GraphQL 才是 API 的未来!
3、全员远程办公,半年入 1 亿美元:GitHub 的最大竞争对手上市了!
4、聊一聊Java 泛型通配符 T,E,K,V,?
5、各大公司程序员的工位,你中意哪一款?
6、Stackoverflow 高赞答案,为什么牛逼的程序员都不用 “ ! = null ' 做判空?
7、为什么不建议在MySQL中使用 utf8 ?
8、编写Spring MVC控制器的14个技巧!涨知识了!
9、日志打印的15个建议!血泪啊!
10、List中remove()方法的陷阱,被坑惨了!

浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报