精华内容
下载资源
问答
  • 在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\...

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

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

    关注微信公众号:互联网架构师,在后台回复:2T,可以获取我整理的教程,都是干货。


    猜你喜欢

    1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

    2、如何才能成为优秀的架构师?

    3、从零开始搭建创业公司后台技术栈

    4、程序员一般可以从什么平台接私活?

    5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

    6、滴滴业务中台构建实践,首次曝光

    7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

    8、15张图看懂瞎忙和高效的区别

    9、2T架构师学习资料干货分享

    展开全文
  • Java学习交流 如果有准备...(邀请码是 369)在 JDK8u 的 jdk 项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for \\(\\s?;\\s?;" . | wc -l369mymbp:/Users/me/workspace/jdk8u/jdk/...

    Java学习交流 如果有准备学习Java或者正在学习的朋友 大家可以来交流一下,共同学习。(邀请码是 369)

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

    展开全文
  • 点击上方蓝色字体,选择“标星公众号”优质文章,第一时间送达来源:https://urlify.cn/aayAFn在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for \\(\\s?;\\s?;" . | ...

    点击上方蓝色字体,选择“标星公众号

    优质文章,第一时间送达

    来源:https://urlify.cn/aayAFn

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

    mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for \\(\\s?;\\s?;" . | wc -l     369mymbp:/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编译之类的就不用说了,输入都一样,输出也不会不同。

    -End-

    3836a616a5ca16dfef13f866f425b9be.png

    在看 ac5d3d79d2d4e37ba722b01d246a39d7.png
    展开全文
  • )与while (true),哪个? 这种规范没有规定的问题,答案都是“看实现”,毕竟实现只要保证语义符合规范就行了,而效率并不在规范管得着的范畴内。以Oracle/Sun JDK8u / OpenJDK8u的实现来看,首先看javac对下面...

    点击“开发者技术前线”,选择“星标????”

    在看|星标|留言,  真爱

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

    回复“666”,获取一份专属大礼包

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

    mymbp:/Users/me/workspace/jdk8u/jdk/src$ egrep -nr "for \\(\\s?;\\s?;" . | wc -l     369mymbp:/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编译之类的就不用说了,输入都一样,输出也不会不同。

     写在最后:

     最后给读者整理了一份大厂面试真题,需要的可扫码回复“大厂面试”获取。

    前线推出学习交流群,加群一定要备注:研究/工作方向+地点+学校/公司+昵称(如前端+上海+上交+可可)根据格式备注,可更快被通过且邀请进群,领取一份专属学习礼包扫码加我微信进群,内推和技术交流,大佬们零距离
    

    END

    好文点个在看吧!

    展开全文
  • 在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk...$egrep-nr"while\\(true".|wc-l 323 并没有差多少。 其次,for (;;) 在Java中的来源。个人看法是喜欢用这种写法的人,追根溯源是...
  • )与while (true),哪个? 这种规范没有规定的问题,答案都是“看实现”,毕竟实现只要保证语义符合规范就行了,而效率并不在规范管得着的范畴内。以Oracle/Sun JDK8u / OpenJDK8u的实现来看,首先看javac对下面...
  • 在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\...
  • )与while (true),哪个? 这种规范没有规定的问题,答案都是“看实现”,毕竟实现只要保证语义符合规范就行了,而效率并不在规范管得着的范畴内。以Oracle/Sun JDK8u / OpenJDK8u的实现来看,首先看javac对下面...
  • 来源:zhihu.com/question/52311366/answer/130090347在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u/jdk/src$egrep-nr"for\\(\\s?;\\s?;".|wc-l369mymbp:/Users/me/workspace/jdk8u/...
  • 来源:zhihu.com/question/52311366/answer/130090347在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u/jdk/src$egrep-nr"for\\(\\s?;\\s?;".|wc-l369mymbp:/Users/me/workspace/jdk8u/jdk/sr....
  • C和PHP中while和for效率的一点研究

    千次阅读 2011-04-28 14:17:00
    在网上看到很多关于while和for循环效率的讨论,有说一样没区别的,也有说这个或者另一个更的。 看了很多也没有一个比较一致的结论,个人觉得这种东西没个绝对,for和while都有各自的优缺点,关键是...
  • I'm using Windows7 using CPython for python3.22 and MinGW's g++.exe for C++ (which means I use the libstdc++ as the runtime library). I wrote two simple programs to compare their speed.Python:x=0while...
  • 用过Matlab的人都知道,Matlab是一种解释性语言,存在计算速度慢的问题,为了提高程序的...矢量化是指将for循环和while循环转换为等价的矢量或矩阵操作。下面给出一个循环的例子:i=0;for n = 0:0.1:1000i=i+1;y(i)=...
  • <p>Take my first example, I declare on the while loop the true statement for it to execute, <pre><code>if ($levelChange > 0) { while ($levelChange != 0) { echo '<p>You gained a level you ...
  • PHP知识小记

    2017-04-28 19:55:43
    for与foreach哪个? 循环数字数组时,for需要事先count($arr)计算数组长度,需要引入自增变量$i,每次循环都要进行条件判断$i<$c,然后自增$i++,输出数组元素时,$arr[$i]需要进行哈希操作.而foreach循环数组时,指针...
  • 数据结构与算法.xmind

    2020-06-19 17:04:23
    第三层while循环找到要插入到哪个位置 归并排序 思想 将两个已排好序的数组合并成一个有序的数组 做法 递归拆分出两个有序的数组,从mid的位置开始拆分,递归出口:只有一个值的...
  • 8.3.1 择哪个方法 145 8.3.2 重载dealloc方法关键字super 147 8.4 通过继承扩展:添加新的实例变量 149 8.5 抽象类 151 8.6 练习 151 第9章 多态、动态类型动态绑定 153 9.1 多态:相同的名称,不同的类 ...
  • 操作系统(内存管理)

    热门讨论 2009-09-20 12:55:25
    while(current_location != last_valid_address) { /* current_location and current_location_mcb point * to the same address. However, current_location_mcb * is of the correct type, so we can ...
  • 就这段代码,下面有3种...可是似乎逆序的时候同样也要遍历相同次数,我并没有在哪个条件下改变i、j的增量,也没有在哪个条件下跳出某次循环。 寻找逆序对的操作同样存在于对逆序数组排序的整个过程中呀。是吧? :)
  • 《数据结构 1800题》

    热门讨论 2012-12-27 16:52:03
    WHILE i<n BEGIN FOR j:=1 TO n DO x:=x+1;i:=i*2 END; 13. 下面程序段中带有下划线的语句的执行次数的数量级是( ) 【合肥工业大学 2001 三、1(2分)】 i:=n*n WHILE i<>1 DO i:=i div 2; 14. 计算机执行下面的...
  • javascript入门笔记

    2018-05-15 15:01:07
    特点:将 a b 先转换为二进制,按位操作,对应位置上的两个数字,相同时,该位整体结果为0,不同时,该位的整体结果为 1 使用场合:快速交换两个数字 5 ^ 3 101 011 ========== 110 结果为 6 练习: ...
  • 10.3.3 覆盖——到底调用了哪个方法 270 10.3.4 覆盖的语法不简单 272 10.3.5 更复杂的使用覆盖的情况 274 10.3.6 覆盖——不得不打开的潘多拉魔盒 276 10.3.7 使用super调用父类中的方法属性 278 10.4 多态...
  • 10.3.3 覆盖——到底调用了哪个方法 270 10.3.4 覆盖的语法不简单 272 10.3.5 更复杂的使用覆盖的情况 274 10.3.6 覆盖——不得不打开的潘多拉魔盒 276 10.3.7 使用super调用父类中的方法属性 278 10.4 多态...
  • 10.3.3 覆盖——到底调用了哪个方法 270 10.3.4 覆盖的语法不简单 272 10.3.5 更复杂的使用覆盖的情况 274 10.3.6 覆盖——不得不打开的潘多拉魔盒 276 10.3.7 使用super调用父类中的方法属性 278 10.4 多态...
  • swap,它还可以将它们映射到文件文件位置,这样,读写内存将对文件中的数据进行读写。不过,在这里,我们只关心 mmap 向进程添加被映射的内存的能力。munmap() 所做的事情与 mmap() 相反。 如您所见,brk() ...
  • 我看到过类似while((c=getchar())!=EOF&&c!='\n')的代码…… 3.7 是否可以安全地认为,一旦&&||左边的表达式已经决定了整个表达式的结果,则右边的表达式不会被求值? 3.8 为什么表达式printf("%d%d",f1(),f2())...
  • 我看到过类似while((c = getchar()) != EOF && c != '\n')的代码…… 35 3.7 是否可以安全地认为,一旦&&||左边的表达式已经决定了整个表达式的结果,则右边的表达式不会被求值? 36  3.8 为什么表达式printf...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    我看到过类似while((c = getchar()) != EOF && c != '\n')的代码…… 35 3.7 是否可以安全地认为,一旦&&||左边的表达式已经决定了整个表达式的结果,则右边的表达式不会被求值? 36  3.8 为什么表达式printf...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

while和for哪个快