作者 | RednaxelaFX

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

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

往期推荐

为什么不推荐使用 stop、suspend 方法中断线程?

阿里6000人发布联合倡议书:杜绝涉黄游戏和丑陋酒桌文化,HR不唯上、应更向人看!

阿里新瓜!又一个衣冠禽兽?

战争升级!Elasticsearch 从客户端向 AWS 开了一炮!

腾讯员工吐槽:团队来了个阿里高p,瞬间会议变多,群多了

喜欢本文欢迎转发,关注我订阅更多精彩

关注我回复「加群」,加入Spring技术交流群

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

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

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

  2. 64位和32位有什么区别?到底哪个更快?——硬核科普

    原文链接:联想商用服务----64位和32位有什么区别?到底哪个更快?--硬核科普 32位和64位到底指什么? 下载 Windows 操作系统,会区分 X 64 和 X 86 版本(一般 X 86 是 ...

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

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

  4. 合并HTTP请求 vs 并行HTTP请求,到底谁更快?

    面试时,经常会问候选人一个问题:如何提高网页性能? 有些基础的人都会提到这么一条:减少/合并HTTP请求. 继续问:浏览器不是可以并行下载资源吗?将多个资源合并成一个资源,只使用一个HTTP请求下载, ...

  5. myisam和innodb到底谁更快

    说一下个人理解: MyISAM只加载了索引数据进内存,加载的数据量少,所以在相同时间内加载进内存的的索引数据也就越多,使CPU在相同时间内查询出更多的索引数据,当然这些必须要在查询的数据量大的情况下才 ...

  6. MyBatis 与 Hibernate 到底哪个更快?

    前言 由于编程思想与数据库的设计模式不同,生出了一些ORM框架. 核心都是将关系型数据库和数据转成对象型.当前流行的方案有Hibernate与myBatis. 两者各有优劣.竞争激烈,其中一个比较重要 ...

  7. C++,Java,Python,Fortran到底哪个更快?

    在<C++的速度比Java快2.1%:来自计算100万以内质数的实验数据对比>这篇文中比较了C++和Java的速度,现在接着用同样的办法通过算1000000以内的质数来比较python和f ...

  8. 转载:JAVA获取时间戳,哪个更快

    转载:http://hi.baidu.com/suofang/item/96629a060a44c119eafe38cc 目前获取毫秒值大概有下面三种方法 Java代码   //方法 一    Sys ...

  9. 【干货】python多进程和多线程谁更快

    python多进程和多线程谁更快 python3.6 threading和multiprocessing 自从用多进程和多线程进行编程,一致没搞懂到底谁更快.网上很多都说python多进程更快,因为G ...

最新文章

  1. 开发中的几种加密算法的使用场景
  2. C# StatusStrip状态栏 例程
  3. 修改场景默认pawn的方法
  4. 这些是实际面试中遇到的面试题
  5. A. Regular Bracket Sequences
  6. 【算法】八大排序算法的时间复杂度 表格
  7. 阿里云宝塔Linux服务器管理面版初始化地址不能登入(原创)
  8. 何为仿射变换(Affine Transformation)
  9. Haar人脸检测:Haar特征 + Adaboost+ 级联分类器及改进
  10. 幂级数 | 函数项级数、函数展开成幂级数(泰勒展开+麦克劳林展开)
  11. 什么是长连接和短连接
  12. 小白入门python教程自学python
  13. 这些天学C++到学ROS,都感觉视频教程效果好些。效率也高些,相比于单自己看书而言。
  14. 41首送别诗词,首首经典,值得为孩子们收藏!
  15. 软件工程复习笔记——第六章 软件维护
  16. 实体链接在小布助手和OGraph的实践应用
  17. 微信小游戏实现语音识别(超详细)
  18. 【红队APT】钓鱼篇Office-CVE漏洞RLO隐藏压缩包释放免杀打包捆绑
  19. 2018西工大计算机学院学生会,风雨同舟,砥砺前行:计算机学院学生会全体会议暨主席团换届竞选答辩举行...
  20. 计算机和hdmi无法正常显示,Win7系统下电脑HDMI连接显示器字体显示虚不清楚如何解决...

热门文章

  1. github使用的一点记录。
  2. javascript获取网页URL地址及参数等
  3. IE6/7/8/9中Table/Select的innerHTML不能赋值
  4. 《裂变》作者爆料:欺世盗名者绝非唐骏一人
  5. java反射的性能问题
  6. linux qemu 源码编译
  7. linux c 关键字 _Noreturn 简介
  8. docker 时间不一致,时区设置
  9. linux 源码编译upx 压缩软件
  10. python3 pyquery模块 解析html网页