Java Boolean.TRUE==someMethod(),其中返回类型为Boolean for someMethod(),并返回一个文本TRUE

Java Boolean.TRUE==someMethod(),其中返回类型为Boolean for someMethod(),并返回一个文本TRUE,java,hibernate,boolean,core,boolean-expression,Java,Hibernate,Boolean,Core,Boolean Expression,请看下面的节目:- 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.t

请看下面的节目:-

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
}
从“Main.java”编译而来
类com.testing.Main{
Main();
代码:
0:aload_0
1:invokespecial#1//方法java/lang/Object。“:()V
4:返回
公共静态void main(java.lang.String[]);
代码:
0:getstatic#2//Field java/lang/System.out:Ljava/io/PrintStream;
3:getstatic#3//字段java/lang/Boolean.TRUE:Ljava/lang/Boolean;
6:新的#4//class com/testing/Main
9:dup
10:invokespecial#5//方法“”:()V
13:invokevirtual#6//方法getBoolean:()Ljava/lang/Boolean;
16:if_acmpne 23
19:iconst_1
20:转到24
23:iconst_0
24:invokevirtual#7//方法java/io/PrintStream.println:(Z)V
27:返回
public java.lang.Boolean getBoolean();
代码:
0:iconst_1
1:invokestatic#8//方法java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
4:轮到你了
}
因此,在Java助记符中: 对于最后一个方法的第0行和第1行,即
getBoolean()方法
, 我们看到自动装箱正在发生,即
iconst_1
int 1
(此处表示“true”)(在第0行)被传递给
Boolean.valueOf()
方法(在第1行)。
Java.Lang
中的
Boolean.valueOf(Boolean b)
方法,返回一个常量
Boolean.TRUE
Boolean.FALSE

因此,在程序
main
方法中,
==
检查应始终正常工作, 或者在Java助记符中:第16行。
但在某些环境中,我认为这是错误的。 怎么可能呢

编辑:这里,在我的例子中,准确地说:Hibernate从 将DB和集合设置为布尔字段。这个布尔字段有一个getter, 这是我上面程序中的
getBoolean()


除非我忽略了这里显而易见的内容,否则这是完全可能的,并且取决于
getBoolean
返回的内容:

public static Boolean getBoolean() {
    return new Boolean(true);
}

Boolean aha = Boolean.TRUE;
Boolean aha2 = getBoolean();

System.out.println(aha == aha2); // false

但是在比较
Boolean
s时,显然必须使用than
Boolean::equals

您的代码运行在什么样的环境中?是否涉及多个类加载器?根据javadoc
Boolean.valueOf()
返回
Boolean.TRUE
Boolean.FALSE
。因此,除非您的jvm实现中有一个bug或者类加载器层次结构真的不完整,否则导致
false
的情况是不可能发生的。(更可能的是,
Boolean
给你的
false
是用
new Boolean(Boolean)
创建的)@k5_u我更担心的是,布尔值没有以某种方式被保存,所以对象比较就接管了。另外,从方法获取的布尔值正在被获取,从MySQL中表中的位列。特定SQL类型位的Java类型为Java.lang.Boolean。Hibernate正在获取此数据。那么它可能是Hibernate错误(即Hibernate不使用@k5_uuu2;said之类的常量),但最好不要首先使用
=
来比较对象。是的,更正一个新的布尔值(布尔值)将使其为false。这是我能假设的唯一情况,这是可能发生的。但是,hibernate是否从数据库中提取位,并返回一个新的布尔值(bitValue)?@AayushShrivastava为什么不找出答案,发布一个答案,如果找到了(并且在以后的版本中没有修复),则向hibernate开发人员报告一个错误。当然,如果是
Boolean.TRUE==getBoolean()
,您不需要使用
equals
,您可以简单地使用
true==getBoolean()
,或者更好地使用
getBoolean()