两种写法的效果一样,那么到底哪一种更好呢?
点击上方蓝色“程序猿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网关的奇怪用法...
【社会】老实工作没有其他收入,为什么还要补缴个税?
【职场】过来人说说银行科技怎么样?值得进去吗?
不知道星球是否适合你?
点击”阅读原文“查看更多星球精华
两种写法的效果一样,那么到底哪一种更好呢?相关推荐
- Vue2基础-el与data的两种写法(HTML版)
目录 一.el的2种写法 二.data的2种写法 三. 一个重要的原则 Vue2基础全套教程合集:点击跳转 Vue2高级全套教程合集:点击跳转 一.el的2种写法 new Vue时候配置 ...
- Vue el和data的两种写法
1.5 el 与 data的两种写法 el 有两种写法 1.创建Vue实例对象的时候配置el属性 2.先创建Vue实例,随后再通过vm.$mount('#root')指定 el 的值 data 有两种 ...
- Latex IEEE模板-多作者多单位的几种写法
我给出了IEEE/ACM论文作者单位的几种写法,就像孔乙己说回字有四种写法一样无聊. IEEE模板会议论文对于多作者多单位的文章,有好几种写法,我这里都给列一下. IEEE模板的下载地址:https: ...
- 数字集成电路设计-12-状态机的四种写法
引言 在实际的数字电路设计中,状态机是最常用的逻辑,而且往往是全部逻辑的核心部分,所以状态机的质量,会在比较大的程度上影响整个电路的质量. 本小节我们通过一个简单的例子(三进制脉动计数器)来说明一下状 ...
- CSS3实现的4种3D文字效果
本文将介绍css3实现的4种3D文字效果.代码很简单,效果很震撼: 代码实现 html: <divclass="demo demo1">3d text effect&l ...
- (五)Vue之data与el的两种写法
文章目录 el的两种写法 data的两种写法 Vue学习目录 上一篇:(四)Vue之数据绑定 下一篇:(六)Vue之MVVC 容器: <div id="root">&l ...
- Vue——05-02组件的数据、为什么data要使用函数、父组件给子组件传递数据的三种写法、父传子以及传两种以上的值、默认值以及父传子的引用类型
目录 在组件中获取数据 二.组件中的data为什么必须要是函数? 父组件给子组件传递数据--props属性 第一种写法: 第二种写法: 第三种写法: 传默认值 : 父组件传子组件数据--引用类型的两种 ...
- 冒泡排序BubbleSort(两种写法)
冒泡排序的核心理念是什么?那就是相邻两数比较,前面的数比后面的数小的话,就交换位置,每次循环找到该次排序的最小值,然后放到该次循环数组的队尾,因此便利到最后,留的就是最大的数. 那么在这里说下冒泡排序 ...
- 关于在页头写Tabs的两种写法
最近有一个需求,需要将antdesign的Tab组件放在页头,而内容分离到页面内容,做成这样的效果: 想要实现这样的写法,要在页头组件PageHeaderLayout里下文章,这里总结两种写法,分别是 ...
最新文章
- 包云岗:关于RISC-V成为印度国家指令集的一些看法
- SDUT-2449_数据结构实验之栈与队列十:走迷宫
- [RM HA 1] Cloudera CDH5 RM HA功能验证
- OpenCV无缝克隆带GUI的模块的实例(附完整代码)
- vue - v-if 注意点
- 【js实例】Array类型的9个数组方法,Date类型的41个日期方法,Function类型
- 【C++深度剖析教程23】继承中的访问级别
- 图片浏览器每次只能打开一张图片_好嗨哟!微信图片批量提取下载,我只用了3秒钟~...
- 未能找到元数据文件_Flink 源码:Checkpoint 元数据详解
- Python判断某一天是该年的第几天
- 一个真正成熟的人不会过度在意别人的眼光
- 手把手教你爬取并下载英雄联盟所有英雄皮肤高清大图
- android编译成功闪退,编译调试-android-app闪退定位
- 操作系统文件存储空间管理(存储空间的划分与初始化)
- java lombok logback 配置日志打印
- SpringBoot 接口加密解密,新姿势
- 王者荣耀微信哪个服务器人多,明明是用微信的比用QQ的多,那为何王者荣耀QQ区人更多?...
- 百度季度亏损了165亿,裁员先动谁?百度游戏MEG被整体裁员
- Java中List集合去除重复数据的六种方法
- MinIO下载和MinIO中国镜像地址