Java:for(;;)vs. while(true)

while(true)循环和for(;;)之间的区别是什么?

编译后有没有,或者都将映射到相同的字节码?

在语义上,它们是完全等价的。 这是一个品味的问题,但我认为while(true)看起来更清洁,并且更容易阅读和理解乍一看。 在Java中,它们都不会导致编译器警告。

在字节码级别上,它可能取决于编译器和优化级别,但原则上所发射的代码应该是相同的。

编辑:

在我的编译器上,使用Bytecode Outline插件, for(;;){}的字节码如下所示:

  L0 LINENUMBER 6 L0 FRAME SAME GOTO L0 

while(true){}的字节码如下所示:

  L0 LINENUMBER 6 L0 FRAME SAME GOTO L0 

所以是的,至less对我来说,他们是一样的。

这取决于你使用哪一个。 因为它们等于编译器。

创build文件:

 // first test public class Test { public static void main(String[] args) { while (true) { System.out.println("Hi"); } } } 

编译:

 javac -g:none Test.java rename Test.class Test1.class 

创build文件:

 // second test public class Test { public static void main(String[] args) { for (;;) { System.out.println("Hi"); } } } 

编译:

 javac -g:none Test.java mv Test.class Test2.class 

比较:

 diff -s Test1.class Test2.class Files Test1.class and Test2.class are identical 

在Oracle Java 7上,您可以获得相同的字节码。 你不能从原来使用的字节码中分辨出来。 哪一个最好是一个品味的问题。 我用while(true)

它编译到相同的字节代码,这是你喜欢的构造的味道的问题。

我从Oracle分布式JDK中读了很多源代码,我不能轻易记得我在代码中看过一段while(true)声明,但是我在代码中看到了大量的for(;;)语句。 我个人,我赞成for(;;) ,我的推理有点像这样:

while循环“应该”需要一个布尔expression式,而不是一个布尔常量。 while(true)有点像if(true) ,我认为这两种观点都只是为了增加群众的舒适感才合法化。 一个空的while()不能编译。 在那里添加true感觉有点像黑客。

for(;;)另一方面是一个“真正的循环”,虽然是空的。 此外,它可以节省您几个击键! =)( 这不重要

因此,我知道这听起来很疯狂,但尽pipe(英文版)读得更好,但我认为(;;)能更好地expression您的意图,而且更类似于Java编程语言。 永远的循环应该避免反正。 当我阅读(;;)时,我感到安全,因为知道开发人员会在某个地方制动执行path。 当我读的时候(真),我不能再那么肯定了。 但是,嘿,也许这只是我! 我们都可以自由挑选自己的味道。

根据编译器的不同,它应该映射到相同的字节码。

JVM会find制作字节码的最好方法,在这两种情况下都应该这样做。所以我认为没有什么区别。 而(真)只是更漂亮。

function上没有区别。 任何由于字节码的差异而获得或损失的效率,与在循环体中运行的任何指令相比,可能都是微不足道的。

我查看了生成的字节码,发现由于条件总是为 (在编译时),编译器将编译掉testing,并将分支始终返回到循环的顶部。 我认为continue语句也会做一个总是回到循环顶部的分支。 所以,不仅没有任何区别,甚至没有任何代码生成来testing任何东西。