请查看以下程序:-
class Main {
public static void main(String[] args) {
System.out.println(Boolean.TRUE == new Main().getBoolean());
}
public Boolean getBoolean() {
return true;
}
}
如果我为此检查Java助记符,则会得到:-
Compiled from "Main.java"
class com.testing.Main {
com.testing.Main();
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 #2 // Field java/lang/System.out:Ljava/io/PrintStream;
3: getstatic #3 // Field java/lang/Boolean.TRUE:Ljava/lang/Boolean;
6: new #4 // class com/testing/Main
9: dup
10: invokespecial #5 // Method "<init>":()V
13: invokevirtual #6 // Method getBoolean:()Ljava/lang/Boolean;
16: if_acmpne 23
19: iconst_1
20: goto 24
23: iconst_0
24: invokevirtual #7 // Method java/io/PrintStream.println:(Z)V
27: return
public java.lang.Boolean getBoolean();
Code:
0: iconst_1
1: invokestatic #8 // Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
4: areturn
}
因此,在Java助记符中:
行号最后一个方法的0和1,即getBoolean() method
,
我们看到自动装箱正在发生,即iconst_1
即int 1
(在这里是“ true”)(在第0行)被传递到Boolean.valueOf()
方法(在第1行)。 >
并且Boolean.valueOf(boolean b)
中的Java.Lang
方法返回常量Boolean.TRUE
或Boolean.FALSE
。
因此,==
检查应始终可以在程序main
方法中正常运行,
或在Java助记符中:第16行。
但是在某些环境中,我看到此返回错误。
怎么可能?
编辑:以我的情况而言,这里是精确的:Hibernate从中获取BIT 数据库并设置为布尔字段。这个布尔字段有一个吸气剂, 这就是我上面的程序中的
getBoolean()
。
答案 0 :(得分:0)
除非我在这里没有找到明显的地方,否则这完全有可能,并且取决于getBoolean
返回的内容:
public static Boolean getBoolean() {
return new Boolean(true);
}
Boolean aha = Boolean.TRUE;
Boolean aha2 = getBoolean();
System.out.println(aha == aha2); // false
显然,在比较Boolean::equals
时必须使用Boolean
。