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

时间:2012-01-16 13:44:37

标签: java for-loop while-loop

标准while(true)循环和for(;;)之间有什么区别?

编译后是否有任何或者都将映射到相同的字节码?

9 个答案:

答案 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)

解析器仅需要时间差异,两个截然不同的表达式包含要解析的令牌数量不同,但是两种情况下的计算时间差异非常小,并且编译后的字节码相同。