Java中"if"条件的奇怪优化

ita*_*chi 9 java compiler-optimization

我决定检查Java编译器的明显性; 因此,我写了一个简单的课程.

public class Foo {
    public Foo(boolean a, int b) {
        if (a == true && a != false) {
            b = 1;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道编译器是否会将条件优化为更简单的条件:

if (a == true) {}
Run Code Online (Sandbox Code Playgroud)

我编译了该类,然后使用该javap工具对其进行了反汇编.当我看一下输出时,我真是傻眼了,因为编译器检查了这两个条件,下面清楚地显示了什么.

Compiled from "Foo.java"
public class Foo {
  public Foo(boolean, int);
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: iload_1
       5: iconst_1
       6: if_icmpne     15
       9: iload_1
      10: ifeq          15
      13: iconst_1
      14: istore_2
      15: return
}
Run Code Online (Sandbox Code Playgroud)

我只是好奇,为什么它可以执行冗余指令,什么时候可以优化到更简单的东西?

Adr*_*ian 14

javac确实没有或只有很少的优化.在字节码的即时(JIT)编译期间发生优化.这是有道理的,因为使用此方法,您可以针对不同的目标平台进行不同的优化,并获得最大的优化结