点击上方“朱小厮的博客”,选择“设为星标”

做积极的人,而不是积极废人!

本文来自:
https://www.zhihu.com/question/52311366/answer/130090347

在JDK8u的jdk项目下做个很粗略的搜索:

mymbp:/Users/me/workspace/jdk8u/jdk/src

$ egrep -nr "for \\(\\s?;\\s?;" . | wc -l

    369

mymbp:/Users/me/workspace/jdk8u/jdk/src

$ egrep -nr "while \\(true" . | wc -l

    323

并没有差多少。

其次,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=1

        0: iconst_0

        1: istore_1

        2: iinc          1, 1

        5: goto          2

*/

与  public void bar() {

   int i = 0;

   for (;;) { i++; }

 }

/*

 public void bar();

   Code:

     stack=1, locals=2, args_size=1

        0: iconst_0

        1: istore_1

        2: iinc          1, 1

        5: goto          2

*/

连javac这种几乎什么优化都不做(只做了Java语言规范规定一定要做的常量折叠,和非常少量别的优化)的编译器,对上面俩版本的代码都生成了一样的字节码。

后面到解释执行、JIT编译之类的就不用说了,输入都一样,输出也不会不同。


往期精彩

《阿里大佬分享面试体会》

《某公司RESTful、公用接口、接口约定等实践》

《ZGC——一个超乎想象的GC器》

《Linux内存中的Cache真的能被回收吗?》

>>>加微信,进群聊<<<

喜欢就点一下「好看」呗~

bool在哪个头文件_Java里的 for (;;) 与 while (true),哪个更快?相关推荐

  1. c++使用多个库的头文件内容里有名字相同问题

    首先说下结构体,如果两个头文件定义的结构体内容不一样,但名字一样,当一个文件同时包含着两个头文件的时候,就会报如下错误: 此时,在不修改头文件的情况下(最好不要改动,不然第三方库可能调用出错),使用命 ...

  2. java数组比较的头文件_Java和C++的数组比较

    Java: 数组的定义: 如下两种方式都可以: int array[]; int[] array; 注意:数组在定义后,不能直接使用.必须在初始化后才能使用. 初始化有两种方式: 1.静态初始化: i ...

  3. java中random的头文件_JAVA中的Random()函數

    Java中存在着兩種Random函數: 一.java.lang.Math.Random; 調用這個Math.Random()函數能夠返回帶正號的double值,該值大於等於0.0且小於1.0,即取值范 ...

  4. java怎么保存文件_java里数据怎么保存到硬盘或TXT文件里去

    import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOExcepti ...

  5. java引用其他类的数据头文件_Java 实现数据表与简单Java类映射转换

    我们在程序开发过程中往往会使用简单Java类进行数据表结构的描述,本文主要介绍如何简单Java类与数据表之间的转换. 首先,先简单介绍一下数据表与简单Java类的相关概念对比: 表的定义 → 实体表设 ...

  6. bucket sort sample sort 并行_Java 中 Arrays.sort 和 Arrays.parallelSort 哪个更快?

    1. 概述 我们都使用过 Arrays.sort() 对对象或原始数据类型数组(byte,short,int,long,char,float,double和boolean)进行排序.在 JDK 8 中 ...

  7. linux编译静态库的头文件,条件编译,头文件,静态库,共享库与多文件编程

    条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软件,当满足条件B时,编译除vip版本的软件,可以提高代码的复用率.条件编译使用&quo ...

  8. linux 头文件卫士,条件编译,头文件,静态库,共享库与多文件编程

    原标题:条件编译,头文件,静态库,共享库与多文件编程 本文转载自嵌入式Linux中文站条件编译 条件编译即满足某些条件的时候编译某部分代码,常用于开发多个版本的程序,当满足条件A时,编译出免费版本的软 ...

  9. 【VSCode PlatformIO】STC15系列单片机开发专用头文件内容分享

    [VSCode PlatformIO]STC15系列单片机开发专用头文件内容分享 如果使用VSCode PlatformIO开发STC单片机,所提供的型号的头文件很有限,除非自己添加,像STC系列单片 ...

最新文章

  1. 刷新中文阅读理解水平,哈工大讯飞联合发布基于全词覆盖中文BERT预训练模型...
  2. command-line: line 0: Bad configuration option: PermitLocalCommand
  3. Websocket 百万长连接技术,在石墨文档中的实践
  4. Windows——双系统环境下没有启动Windows 启动管理器(自动跳过操作系统选择界面)解决方案
  5. python应用程序类型_python – 类型提示条件可变参数应用程序
  6. 代码编写工具_我希望在开始编写代码时就已经知道的工具:已复习
  7. seata分布式事务回滚机制是如何实现的
  8. lucene开发序之luke神器
  9. react 使用rewired_create-react-app 通过 react-app-rewired 添加 webpack 的 alias
  10. CF620E New Year Tree
  11. 上银驱动器使用手册_上银伺服电机调试说明书PPT课件
  12. 我的软件测试修炼之道
  13. 虚拟机VMware安装PhoenixOS(凤凰OS)
  14. Android Studio 华为手机真机调试
  15. 如何才能不看知乎广告?手机浏览器安装Edge扩展程序教程
  16. 微软2013校园招聘笔试题
  17. linux下批量改文件名命令,Linux 批量更改文件名命令
  18. scrapy爬取豆瓣top250电影数据
  19. 小米手机下载文件失败,提示权限不足
  20. oracle的cbd和pdb区别,Oracle 12C CDB、PDB常用管理命令

热门文章

  1. 阿里云ECS主机自定义进程监控
  2. Java parallel control
  3. 基于Java的四大开源测试工具
  4. 使用windows服务更新站点地图
  5. Unable to find the ncurses libraries or the required header files解决
  6. 伪装qizhi software数字签名的下载者分析报告
  7. 故障排除:硬盘坏道修复术
  8. netcore中使用grpc
  9. 【翻译】QEMU内部机制:顶层概览
  10. Centos 安装 MySql