While(true) 和 for(; 😉 都是做无限循环的代码,他们两个有什么区别呢?
关于这个问题,网上有很多的讨论,今天我收到私信,所以凑着假期,统一回复一下这个问题。
说多了无用,直接反编译吧,看看字节码有什么区别我们就明白了。
首先我们来准备两段代码:
/**
* 编程实现两种方式无限循环性能比较
*/
public class WhileAndFor {
public static void main(String[] args) {
//Code.1 While的无限循环
while (true) {
System.out.println("this is a WhileDemo......");
}
}
}
/**
* 编程实现两种方式无限循环性能比较
*/
public class WhileAndFor {
public static void main(String[] args) {
//Code.1 For的无限循环
for(; ; ) {
System.out.println("this is a ForDemo......");
}
}
}
我们首先在控制台将这两段代码编译成 .class 文件
因为我的这个电脑老是乱码,所以我加了
-encoding utf-8
,你们的不需要就不用加。
javac -encoding utf-8 WhileAndFor.java
然后我们再通过javap
对 .class
文件进行反编译,然后我们就会发现,两个文件的内容,简直是一模一样。
PS F:\Java> javac -encoding utf-8 WhileAndFor.java
PS F:\Java> javap -c WhileAndFor.class
Compiled from "WhileAndFor.java"
public class WhileAndFor {
public WhileAndFor();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String this is a Fordemo......
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: goto 0
}
PS F:\Java> javac -encoding utf-8 WhileAndFor.java
PS F:\Java> javap -c WhileAndFor.class
Compiled from "WhileAndFor.java"
public class WhileAndFor {
public WhileAndFor();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #13 // String this is a WhileDemo......
5: invokevirtual #15 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: goto 0
}
PS F:\Java>
可以看到,都是通过
goto
来干的,所以,这两者其实是没有任何的区别,针对个人喜欢,用哪个都行。
有人愿意用while(true)
,因为可以更清晰的来出来这是个无限循环,有人愿意用 for(;;)
,因为有些 IDE 对于While(true)会给出警告。当然我们也可以抑制警告是吧,用@SuppressWarnings(“all”),当然抑制警告的属性不是只有all一种是吧,比如抑制资源警告我们用@SuppressWarnings(“resource”)有兴趣大家可以自行去查阅。
祝大家元旦快乐!阖家幸福!家庭幸福美满!事业腾飞冲天!