点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

有时候,我们在写一些循环逻辑的时候,并不是按执行次数等作为条件了,但是根据某个条件(比如:某个参数、某个配置变为指定值)达到标准的时候才跳出循环,不然一直执行下去的逻辑。这时候我们就会出现这几种写法:

  • while (true)

  • for (;;)

那么问题来了,这两种写法哪一种更好呢?

关于这种犄角旮旯的问题,相信难倒了大部分Javaer,下面一起来看看R大在知乎上的解答,学习一下这两种写法背后的执行逻辑,再来看看

以下内容转载自:https://www.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编译之类的就不用说了,输入都一样,输出也不会不同。

往期推荐

MySQL百万级、千万级数据多表关联SQL语句调优

斗鱼开源基于Go实现的微服务框架 Jupiter

以为是行废代码,原来有这作用!

一行代码引来的安全漏洞就让我们丢失了整个服务器的控制权

尤雨溪:重头来过的 Vue 3 带来了什么?

用了那么多年的 Master 分支或因种族歧视而成为历史?

最后两天优惠啦!

欢迎加入我的知识星球,每周二聊技术,每周六侃社会!

最近更新

【预告】一个给阿里提的数据安全问题

【分享】最近碰到的API网关的奇怪用法...

【社会】老实工作没有其他收入,为什么还要补缴个税?

【职场】过来人说说银行科技怎么样?值得进去吗?

不知道星球是否适合你?

点击”阅读原文“查看更多星球精华

两种写法的效果一样,那么到底哪一种更好呢?相关推荐

  1. Vue2基础-el与data的两种写法(HTML版)

    目录 一.el的2种写法 二.data的2种写法 三. 一个重要的原则 Vue2基础全套教程合集:点击跳转        Vue2高级全套教程合集:点击跳转 一.el的2种写法 new Vue时候配置 ...

  2. Vue el和data的两种写法

    1.5 el 与 data的两种写法 el 有两种写法 1.创建Vue实例对象的时候配置el属性 2.先创建Vue实例,随后再通过vm.$mount('#root')指定 el 的值 data 有两种 ...

  3. Latex IEEE模板-多作者多单位的几种写法

    我给出了IEEE/ACM论文作者单位的几种写法,就像孔乙己说回字有四种写法一样无聊. IEEE模板会议论文对于多作者多单位的文章,有好几种写法,我这里都给列一下. IEEE模板的下载地址:https: ...

  4. 数字集成电路设计-12-状态机的四种写法

    引言 在实际的数字电路设计中,状态机是最常用的逻辑,而且往往是全部逻辑的核心部分,所以状态机的质量,会在比较大的程度上影响整个电路的质量. 本小节我们通过一个简单的例子(三进制脉动计数器)来说明一下状 ...

  5. CSS3实现的4种3D文字效果

    本文将介绍css3实现的4种3D文字效果.代码很简单,效果很震撼: 代码实现 html: <divclass="demo demo1">3d text effect&l ...

  6. (五)Vue之data与el的两种写法

    文章目录 el的两种写法 data的两种写法 Vue学习目录 上一篇:(四)Vue之数据绑定 下一篇:(六)Vue之MVVC 容器: <div id="root">&l ...

  7. Vue——05-02组件的数据、为什么data要使用函数、父组件给子组件传递数据的三种写法、父传子以及传两种以上的值、默认值以及父传子的引用类型

    目录 在组件中获取数据 二.组件中的data为什么必须要是函数? 父组件给子组件传递数据--props属性 第一种写法: 第二种写法: 第三种写法: 传默认值 : 父组件传子组件数据--引用类型的两种 ...

  8. 冒泡排序BubbleSort(两种写法)

    冒泡排序的核心理念是什么?那就是相邻两数比较,前面的数比后面的数小的话,就交换位置,每次循环找到该次排序的最小值,然后放到该次循环数组的队尾,因此便利到最后,留的就是最大的数. 那么在这里说下冒泡排序 ...

  9. 关于在页头写Tabs的两种写法

    最近有一个需求,需要将antdesign的Tab组件放在页头,而内容分离到页面内容,做成这样的效果: 想要实现这样的写法,要在页头组件PageHeaderLayout里下文章,这里总结两种写法,分别是 ...

最新文章

  1. 包云岗:关于RISC-V成为印度国家指令集的一些看法
  2. SDUT-2449_数据结构实验之栈与队列十:走迷宫
  3. [RM HA 1] Cloudera CDH5 RM HA功能验证
  4. OpenCV无缝克隆带GUI的模块的实例(附完整代码)
  5. vue - v-if 注意点
  6. 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型
  7. 【C++深度剖析教程23】继承中的访问级别
  8. 图片浏览器每次只能打开一张图片_好嗨哟!微信图片批量提取下载,我只用了3秒钟~...
  9. 未能找到元数据文件_Flink 源码:Checkpoint 元数据详解
  10. Python判断某一天是该年的第几天
  11. 一个真正成熟的人不会过度在意别人的眼光
  12. 手把手教你爬取并下载英雄联盟所有英雄皮肤高清大图
  13. android编译成功闪退,编译调试-android-app闪退定位
  14. 操作系统文件存储空间管理(存储空间的划分与初始化)
  15. java lombok logback 配置日志打印
  16. SpringBoot 接口加密解密,新姿势
  17. 王者荣耀微信哪个服务器人多,明明是用微信的比用QQ的多,那为何王者荣耀QQ区人更多?...
  18. 百度季度亏损了165亿,裁员先动谁?百度游戏MEG被整体裁员
  19. Java中List集合去除重复数据的六种方法
  20. MinIO下载和MinIO中国镜像地址

热门文章

  1. linux 安装 nodejs
  2. 对抗粉尘攻击——CashShuffle正在保护BCHer隐私
  3. python3 打印对象的全部属性
  4. shellcode中动态定位API
  5. TDI Filter 过滤驱动
  6. C语言--对数组地址的解析
  7. Java设计模式---外观模式
  8. Android实现手机手电筒
  9. Shell脚本个例二
  10. 绝地求生服务器延迟高低排序,绝地求生:延迟不可怕,大神教你如何高ping吃鸡!...