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任何东西。