obj == null vs null == obj

baj*_*jji 9 java oop

我总是习惯于检查null

if(null==obj)
Run Code Online (Sandbox Code Playgroud)

当我编译我的代码并在反编译后查看.class文件时,我可以看到我的代码被更改为

if(obj==null)
Run Code Online (Sandbox Code Playgroud)

我知道在java中null==objobj==null没有关系.但我很想知道为什么编译器会改变它?

das*_*ght 9

编译器没有改变任何东西.它忠实地编译if (null == obj)if (obj == null)转换成不同的字节码,反编译器转换回相同的Java代码.

null右边比较,即

if (o == null) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

通过ifnonnull指令转换为此字节代码:

0: aload_0
1: ifnonnull     ...
Run Code Online (Sandbox Code Playgroud)

null左边比较,即

if (null == o) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

通过if_acmpne指令转换为不同的字节码:

0: aconst_null
1: aload_0
2: if_acmpne     ...
Run Code Online (Sandbox Code Playgroud)

理论上,反编译器有足够的信息来确定参数在源文件中的排序方式.但是,他们为两个订单生成了相同的代码.