java.lang.Boolean两个以上的实例

时间:2013-04-05 09:26:33

标签: java

我注意到HiberSAP ProjectBooleanConverter Linenumber 75)的代码中存在一种非常奇怪的行为。

问题是布尔值不会转换为'X'。我调试了代码并检查了布尔表达式javaValue == Boolean.TRUE。此表达式被解释为false,因为javaValue为Boolean.TRUE且ID为36且Boolean.TRUE具有ID 33(该ID显示在Eclipse IDE的Variables-View中)。我也可以检查所有布尔实例,实际上,有四个java.lang.Boolean实例!!

有人可以解释一下为什么会发生这种情况。


编辑:

好的,我认为我的问题不够准确。应转换的字段是布尔而不是 java.lang.Boolean 。这必须是Classloader Fault。在我的例子中,从布尔到布尔的唯一转换是由JVM完成的。我知道每个Object比较应该使用.equals()(我填写一个Bug)但在这种情况下它应该可以正常工作。请参阅以下代码:

public static void main(String[] args) {
    for(int i = 0; i < 1000; i++){
        print(true);
    }

}

public static void print(Object value) {
    System.out.println(value);
}

这应该 NOT 创建1000个java.lang.Boolean实例。这应该始终使用java.lang.Boolean.TRUE!这是我无法理解的守则的奇怪行为。

也许这是Hibersap所做反射的副作用?但我认为这不应成为这种行为的原因。

拜托,我只想了解。

1 个答案:

答案 0 :(得分:3)

每次执行new Boolean(true)new Boolean(false)时,都会创建一个新的Boolean实例,根据定义,它与其他实例不同。除了枚举之外,永远不应将对象与==进行比较。请改用.equals()。或者,在您的情况下,请使用javaValue.booleanValue()

相关问题