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

共 1969字,需浏览 4分钟

 ·

2021-11-21 00:32

往期热门文章:

1、名企公开挂“加班真好”标语,员工称一年被免费“白嫖”600多小时!网友看不下去了,稽查部门展开调查...

2、面试官:为什么 Java 不把基本类型放在堆中?我竟然答不上来。。

3、IDEA 注释模板这样搞!

4、后端开挂:3行代码写出8个接口!

5、推荐一款可视化配置 Nginx 的神器

来源: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 -l 323
并没有差多少。

其次,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=1 0: iconst_0 1: istore_1 2: iinc 1, 1 5: goto 2*/
public void bar() { int i = 0; for (;;) { i++; } }
/* public void bar(); Code: stack=1, locals=2, args_size=1 0: iconst_0 1: istore_1 2: iinc 1, 1 5: goto 2*/

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

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

最近热文阅读:

1、名企公开挂“加班真好”标语,员工称一年被免费“白嫖”600多小时!网友看不下去了,稽查部门展开调查...
2、面试官:为什么 Java 不把基本类型放在堆中?我竟然答不上来。。
3、IDEA 注释模板这样搞!
4、后端开挂:3行代码写出8个接口!
5、推荐一款可视化配置 Nginx 的神器
6、一款性能调优利器 — 火焰图
7、Redis 实现限流的三种方式
8、推荐 15 款常用开发工具
9、一次 QPS 翻倍的 Java 服务性能优化
10、Maven 划分模块最佳实践
关注公众号,你想要的Java都在这里

浏览 23
点赞
评论
收藏
分享

手机扫一扫分享

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

手机扫一扫分享

分享
举报