在 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编译之类的就不用说了,输入都一样,输出也不会不同。

作者:RednaxelaFX

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

猜你喜欢

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

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

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

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

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

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

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

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

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

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

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

  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. J. Cheminform. | 基于化学基因组学中深度和浅层学习预测药物特异性
  2. OpenCV参考手册之Mat类详解1
  3. LeetCode-字符串-反转字符串中的单词 II
  4. Java中最早期的集合Vector
  5. CentOS 7.6 下安装 MySQL8.0.13
  6. wstring和string简单正则表达式使用
  7. JAVA线程池ScheduledExecutorService周期性地执行任务 与单个Thread周期性执行任务的异常处理
  8. 常用的DOS功能输入输出
  9. css 固定宽度,自动换行
  10. OD数据集(一)—介绍
  11. 读书笔记——《灰度决策:如何处理复杂、棘手、高风险的难题》
  12. Glusterfs stripe卷挂载失败问题-客服端挂载提示:Mounting glusterfs on /test0 failed.
  13. 跨考西北工业大学计算机专硕,西工大计算机专硕400+上岸学长经验分享
  14. RN 调用原生WebPage 解决微信支付Referer问题
  15. springmvc对json数据的处理
  16. linux 锁定用户目录,Linux vfpd锁定用户目录
  17. 文件未上传成功再次点击上传报错问题处理
  18. 淘宝网及新浪网等几大官方IP查询API接口地址库的调用及使用方法教程
  19. Win10彻底关闭实时保护
  20. 毕业回忆我的大学(2)——上课、考试

热门文章

  1. 了解java虚拟机mdash;串行回收器(6)
  2. puppet成长日记四 Exec资源详细介绍及案例分析
  3. asp.mvc 基本知识
  4. 坚果云忽略同步文件的设置
  5. Max Points on a Line@LeetCode
  6. php使用memcache处理缓存数据
  7. 检查和安装过程中的常见的问题
  8. UNIX环境高级编程之第4章:文件和目录-习题
  9. 苹果Mac一定要学会的快捷键
  10. iOS开发UIAlertController之UIAlertAction加图片(UIAlertController按钮加图片)