While(true)和for(;;)哪个性能好?
面试回答¶
面试官: while(true) 和 for(;;) 哪个性能好?
你:
性能完全一样,没有任何区别。
因为在编译之后,两者的字节码是完全相同的,都是一个无条件跳转指令 goto。所有差异都只停留在源码层面,被 javac 一编译就抹平了。
具体解释:
while(true) 在语法上需要一个布尔表达式,而 true 是编译期常量,编译器直接把它优化成无条件跳转。
for(;;) 的循环条件为空,Java 语言规范里明确说空条件等价于 true,所以也是无条件跳转。
你反编译一下就能看到,两个写法的字节码都是一个 goto 指令往回跳,循环体完全一致。JIT 编译器更不会区别对待,它只看到相同的 goto 结构,内联、循环展开等优化也完全一样。
那为什么大家还在纠结用哪个?
主要是代码风格和工具检查。有些静态分析工具会对 while(true) 报“条件始终为真”的警告,因为它在字节码层面相当于 ifeq 判断永远不成立,然后一个 goto。而 for(;;) 本身语法上就表示无限循环,通常不会有警告。另外 for(;;) 更短,看起来更“硬核”。两者都可以选,看团队习惯,跟性能没关系。
