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

2022-08-31 13:57:09

标准循环 和 ?while(true)for(;;)

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


答案 1

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

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

编辑:

在我的编译器上,使用Bytecode Outline插件,字节码看起来像这样:for(;;){}

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

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

   L0
    LINENUMBER 6 L0
   FRAME SAME
    GOTO L0

所以,是的,至少对我来说,它们是相同的。


答案 2

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

创建文件:

// 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