有了 for (;;) 为什么还需要 while (true) ? 到底哪个更快?
今日推荐
这 9 个 Java 开源项目 yyds,你知道几个?阿里技术专家推荐的20本书,免费送!K8S 部署 SpringBoot 项目(一篇够用)妙用Java 8中的 Function接口 消灭if...else(非常新颖的写法)
Nginx 入门到实战,新手必懂。
作者:RednaxelaFX
链接: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面试库小程序在线刷题。
顺带一提,在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编译之类的就不用说了,输入都一样,输出也不会不同。
推荐文章
1、一款高颜值的 SpringBoot+JPA 博客项目2、超优 Vue+Element+Spring 中后端解决方案3、推荐几个支付项目!4、推荐一个 Java 企业信息化系统5、一款基于 Spring Boot 的现代化社区(论坛/问答/社交网络/博客)
有了 for (;;) 为什么还需要 while (true) ? 到底哪个更快?相关推荐
- 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?
转自:知乎 www.zhihu.com/question/52311366/answer/1300903 在 JDK8u 的 jdk 项目下做个很粗略的搜索: mymbp:/Users/me/work ...
- while (true) 和 for (;;) 到底哪个更快?
作者 | RednaxelaFX 来源 | https://zhihu.com/question/52311366/answer/130090347 在JDK8u的jdk项目下做个很粗略的搜索: my ...
- bool在哪个头文件_Java里的 for (;;) 与 while (true),哪个更快?
点击上方"朱小厮的博客",选择"设为星标" 做积极的人,而不是积极废人! 本文来自: https://www.zhihu.com/question/523113 ...
- getdevicecaps在哪个头文件里_一招定胜负,while (true) 和 for (;;) 到底哪个更快
在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for (s?;s?;" . ...
- Java里的 for (;;) 与 while (true),哪个更快?
在JDK8u的jdk项目下做个很粗略的搜索: 并没有差多少. 其次,for (;;) 在Java中的来源.个人看法是喜欢用这种写法的人,追根溯源是受到C语言里的写法的影响.这些人不一定是自己以前写C习 ...
- Java 里的 for (;;) 与 while (true),哪个更快?
点击关注公众号,Java干货及时送达 在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr " ...
- 琢磨琢磨,while (true) 和 for (;;) 哪个更快?!
在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\s?;&q ...
- python append函数_让你python代码更快的3个小技巧!速度提高了一倍还多
大家好!今天呢,我们来聊一聊如何加速你的 python 代码. Python 语言的优点可以列举出许多,语法简单易懂.模块丰富.应用广泛等等.但是世界上没有有完美的东西,python 一个明显缺点就是 ...
- 还不会哈希吗?快进来一探究竟
Hash目录 一. 无序系列关联式容器 1. 对比 2. unordered_map 3. unordered_set 4.小总结 二. 哈希表 1. 哈希函数 直接定址法 除留余数法 平方取中法 2 ...
最新文章
- Java7之线程池ForkJoinPool
- 项目日报模板_雄东片区A单元安置房项目首栋住宅楼主体结构封顶
- php面向对象的概括图解,深入分析php之面向对象
- 搜索引擎优化网页设计:最佳实践
- ecshop 标签使用 非常好的例子
- Debug Assertion Failed _CrtlsValidHeapPointer(block) realloc堆引发的错误
- python中pd.read_Windows下Python的pd.read_excel()报错
- iView学习笔记(四):Form表单操作
- 人工智能时代的危机_AI信任危机:如何前进
- SpringBoot移除内置Tomcat
- 中文停用词库,不用C币直接复制
- 互联网快讯:百度地图第二代车道级导航上线;猿辅导推智能练习本布局教育智能硬件;vivo WATCH 2智能手表正式发布
- UE4大场景解决方案 ——Pak的打包与加载
- token代替session使用
- 5G能否成化合物半导体产业突破口
- java 摩尔斯电码_使用Java进行摩尔斯电码转换
- Java进阶4-Elasticsearch
- html弹窗可以关闭,js 点击弹窗以外 关闭弹窗
- 微信小程序 保存图片
- 【转载】elastic-job链接zookeeper报错KeeperErrorCode = OperationTimeout
热门文章
- sturst2的原理及环境搭建
- Silverlight - Out of Browser配置,安装和卸载
- 也许你不知道的c#基本数据类型及其默认值
- Linux之解析鼠标input事件数据
- linux内核之 phys_to_virt
- 二、前端开发-HTML
- 现代密码学2.4--香农定理/Shannon Theorem:完美安全的充分必要条件
- 设计模式--抽象工厂(Abstract Factory)模式
- 【Python小脚本】实现王者农药自动刷金币啦~啦啦啦走跟我一起组队~
- 【Flask】Jinja2模板的使用及控制语句