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

mymbp:/Users/me/workspace/jdk8u/jdk/src
$ egrep -nr "for \\(\\s?;\\s?;" . | wc -l369
mymbp:/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编译之类的就不用说了,输入都一样,输出也不会不同。

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

关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别

9、2T架构师学习资料干货分享

while (true) 和 for (;;) 哪个更快?相关推荐

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

    今日推荐 这 9 个 Java 开源项目 yyds,你知道几个?阿里技术专家推荐的20本书,免费送!K8S 部署 SpringBoot 项目(一篇够用)妙用Java 8中的 Function接口 消灭 ...

  2. 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?

    转自:知乎 www.zhihu.com/question/52311366/answer/1300903 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/work ...

  3. while (true) 和 for (;;) 到底哪个更快?

    作者 | RednaxelaFX 来源 | https://zhihu.com/question/52311366/answer/130090347 在JDK8u的jdk项目下做个很粗略的搜索: my ...

  4. bool在哪个头文件_Java里的 for (;;) 与 while (true),哪个更快?

    点击上方"朱小厮的博客",选择"设为星标" 做积极的人,而不是积极废人! 本文来自: https://www.zhihu.com/question/523113 ...

  5. 琢磨琢磨,while (true) 和 for (;;) 哪个更快?!

    在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\s?;&q ...

  6. getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快

    在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . ...

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

    在JDK8u的jdk项目下做个很粗略的搜索: 并没有差多少. 其次,for (;;) 在Java中的来源.个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响.这些人不一定是自己以前写C习 ...

  8. 使用Python,dlib中新型、更快、更小的5点面部标志检测器检测人脸、眼睛、鼻子

    这篇博客将介绍一个新的dlib面部标志检测器--5点人脸标志模型,它比原始版本更快(提高了8-10%),效率更高,模型更小(降低了10倍). 该5点面部标志检测器被认为是最初随dlib库一起分发的68 ...

  9. Google 开源的依赖注入库,比 Spring 更小更快!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:GinoBeFunny zhuanlan.zhihu.com ...

  10. 让 Spring Boot 启动更快一点

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 "Spring有多快?" 这是 2018 Sp ...

最新文章

  1. 八成名校AI教授,都拿过谷歌微软亚马逊们的钱
  2. python基础学习笔记(六)
  3. 企业安全建设之搭建开源SIEM平台(上)
  4. 区块链BaaS云服务(36)欧盟“用户身份认证”ESSIF
  5. JAVA——RSA加密【X509EncodedKeySpec、PKCS8EncodedKeySpec、RSAPublicKeySpec、RSAPrivateKeySpec】
  6. 网页设计上机考试原题_《网页设计》上机考试试题
  7. 中移M5310A NBIoT模组通信测试命令
  8. 线性回归的Spark实现 [Linear Regression / Machine Learning / Spark]
  9. 《Python编程从入门到实践》记录之列表解析
  10. 嘀嗒与钉钉合作推出职场顺风车 3月已在杭州测试
  11. 【gulp-sass】本地搭建sass开发环境
  12. 使用xmodmap修改键盘映射
  13. Cisco Firewall ASA conn code
  14. 02-body标签中相关标签
  15. 今日头条 mysql_今日头条的核心架构解析
  16. k8s多节点master部署
  17. MySql下载及安装部署
  18. Pandas与SQL比较
  19. HTML 锁定表格首行首列、拖拽表格列宽
  20. Java Scanner类的方法及用法(很详细)

热门文章

  1. Vue子组件调用父组件的方法
  2. struts2源码系列(3)--拦截器
  3. baidu__git_android
  4. 玩转SSRS第五篇---客户端报表
  5. RSA总裁:2010年需重点关注云计算安全
  6. Illustrator 教程,如何在 Illustrator 中添加一行文字?
  7. 如何在 Mac 上控制对摄像头的访问?
  8. 如何使用 macOS 帮助菜单?
  9. 如何将显示器连接到 Mac?
  10. 艺术字体图标设计软件Art Text 4 for Mac