标准while(true)
循环和for(;;)
之间有什么区别?
编译后是否有任何或者都将映射到相同的字节码?
答案 0 :(得分:104)
从语义上讲,它们完全相同。这是一个品味问题,但我认为while(true)
看起来更干净,乍一看更容易阅读和理解。在Java中,它们都不会导致编译器警告。
在字节码级别,它可能取决于编译器和优化级别,但原则上发出的代码应该是相同的。
修改强>
在我的编译器上,使用Bytecode Outline插件,for(;;){}
的字节码如下所示:
L0
LINENUMBER 6 L0
FRAME SAME
GOTO L0
while(true){}
的字节码如下所示:
L0
LINENUMBER 6 L0
FRAME SAME
GOTO L0
所以是的,至少在我看来,它们是完全相同的。
答案 1 :(得分:25)
由您决定使用哪一个。因为它们等于编译器。
创建文件:
// 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
创建文件:
// 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
答案 2 :(得分:7)
它编译为相同的字节代码,这是你喜欢构建的品味问题。
我从Oracle分布式JDK中读了很多源代码,我不能轻易记住我在他们的代码中看过while(true)
语句,但我看到了很多for(;;)
他们的代码中的陈述。我个人而言,我赞成for(;;)
,我的理由有点像这样:
while循环“应该”需要布尔表达式,而不是布尔常量。 while(true)
有点像if(true)
,我认为这两者都是合法的,只是为了增加群众的安慰。空while()
无法编译。在那里添加true
感觉有点像黑客。
for(;;)
是一个“真正的循环”,虽然是空的循环。此外,它还为您节省了几次击键! =)(不重要)
因此,我知道这听起来很疯狂,但虽然虽然(真实)读取英语更好,但我认为(;;)更能表达您的意图,更类似于Java编程语言。无论如何应该避免永恒的循环。当我读(;;)时,我感到安全,因为知道开发人员会在某处制造执行路径。当我读(真)时,我再也不能确定了。但是,嘿,也许这就是我!我们都可以自由选择自己的风味。
答案 3 :(得分:6)
在Oracle Java 7上,您获得相同的字节代码。您无法从原始中使用的字节代码中分辨出来。哪个最好是品味问题。我使用while(true)
答案 4 :(得分:3)
根据编译器的不同,它应映射到相同的字节代码。
答案 5 :(得分:3)
JVM将找到制作字节码的最佳方法,在这两种情况下都应该这样做。所以我认为没有区别。虽然(真实)更漂亮。
答案 6 :(得分:3)
我查看了生成的字节代码,发现由于条件总是 true (在编译时),编译器会编译测试并且只是分支总是回到顶部环。我假设 continue 语句也会将分支始终返回到循环的顶部。所以,它不仅没有任何区别,甚至没有任何代码生成来测试任何东西。
答案 7 :(得分:2)
功能上没有区别。与您在循环体中运行的任何指令相比,字节码差异所带来的任何效率都可能无关紧要。
答案 8 :(得分:1)
解析器仅需要时间差异,两个截然不同的表达式包含要解析的令牌数量不同,但是两种情况下的计算时间差异非常小,并且编译后的字节码相同。