标准的while(true)
循环和for(;;)
有什么区别?
它们是否有任何区别,或者在编译后将映射到相同的字节码?
标准的while(true)
循环和for(;;)
有什么区别?
它们是否有任何区别,或者在编译后将映射到相同的字节码?
while(true)
看起来更干净,更易于一眼阅读和理解。在Java中,它们都不会引起编译器警告。for(;;){}
的字节码如下: L0
LINENUMBER 6 L0
FRAME SAME
GOTO L0
while(true){}
的字节码如下:
L0
LINENUMBER 6 L0
FRAME SAME
GOTO L0
对我来说,它们是相同的。
这取决于你想使用哪个。因为它们都等同于编译器。
创建文件:
// 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
for(;;)
而不是while(true)
! - vedi0boywhile(true)
不太受欢迎。 - vedi0boy它编译成相同的字节码,取决于你喜欢哪种结构。
我阅读了很多来自Oracle分布式JDK的源代码,我不太容易记得我曾在他们的代码中看到过while(true)
语句,但我确实看到了很多for(;;)
语句。我个人更喜欢for(;;)
,我的理由是:
while循环“应该”需要一个布尔表达式,而不是一个布尔常量。while(true)
有点像if(true)
,我认为这两个都只是为了增加大众的舒适感而合法化。空的while()
不会编译。在其中添加true
感觉有点像黑客行为。
另一方面,for(;;)
是一个“真正的循环”,尽管是一个空循环。此外,它还可以为您节省一些按键! =)(虽然这没什么关系)
因此,虽然while(true)在英语中读起来更好,但我认为for(;;)更能表达您的意图,并且更符合Java编程语言。无论如何,应该避免永久循环。当我读到for(;;)时,我感到很安全,因为我知道开发人员会在某个地方中断执行路径。当我读到while(true)时,我就不能那么确定了。但是嘿,也许只是我的想法!我们都可以自由选择自己的风格。
while(true)
。根据编译器的不同,它应该映射到相同的字节码。
JVM会找到最佳的方法来生成字节码,在两种情况下应该是相同的。因此,我认为没有区别。while(true)只是更美观。
从功能上来说,它们没有区别。任何因字节码差异而获得或失去的效率都很可能与您在循环体中运行的任何指令相比微不足道。
只需要解析器的时间有所不同,两个不同的表达式包含不同数量的标记需要解析,但计算时间差异非常小,并且两种情况的编译字节码相同。