false和Boolean.FALSE有什么区别?

时间:2013-11-20 07:56:28

标签: java boolean primitive-types

在C ++中windows.h FALSE被定义为整数,这对某些特殊逻辑情况有意义,但在Java java.lang.Boolean.FALSE中定义为boolean并赋值为false public static final Boolean FALSE我看到有些人使用它。

我的问题:falseBoolean.FALSE之间是否存在性能差异?一般来说为什么人们去Boolean.FALSE

8 个答案:

答案 0 :(得分:30)

请参阅http://docs.oracle.com/javase/7/docs/api/java/lang/Boolean.html

Boolean.TRUEBoolean.FALSE不是boolean,而是Boolean。它们是与Booleanbooleantrue对应的两个false包装器对象的静态实例。

Boolean类似于enumTRUEFALSE实例是Boolean.valueOf()返回的实例。

原始与包装的表现;没有什么区别,你需要关注。 TRUEFALSE静态实例有助于提升性能,而javadocs建议使用Boolean.valueOf()而不是new Boolean(...)truefalse布尔值有点“较低级别”,但如果您将它们存储在Boolean(而不是boolean)中,则无关紧要。< / p>

你应该使用对你的代码最有意义的东西,并导致最佳的可读性(并且绝对不会开始考虑微优化,如原始类型和包装类型)。如果您使用的是Boolean,请使用对象值。如果您使用的是boolean,请使用原始值。如果您要在Booleanboolean之间做出决定,请使用更合适的内容(例如,Boolean可以是null,这可能很有用,而且您也无法使用泛型类型参数的基本类型;另一方面,boolean 永远不会成为null,这可能同样有用。)

另请注意,自动装箱会将基元类型转换为这两个静态Boolean实例中的一个,例如:

Boolean a = true;
assert(a == Boolean.TRUE);



顺便说一下,既然你提到了它:FALSEwindows.h中定义有两个原因:1)因为{C}仅使用了windows.h,所以没有本地bool类型,2)传统的Microsoft实践是使用已知的显式大小和值来定义数据类型和值,尤其是。用于跨DLL边界(超出此问题的范围)将数据传递到Windows API函数,以及与具有“true”和“false”的不同表示的其他语言集成。它与Java中Boolean.FALSE的原因完全无关。

答案 1 :(得分:5)

false是一个原语,Boolean.FALSE是一个对象,因此它们并不具有可比性。

如果您将false分配给Boolean变量,请执行以下操作:

Boolean b = false;

Java的自动装箱会将原语转换为对象,因此false值会丢失,最后你会以Boolean.FALSE结束。

在性能方面,使用原始变量将稍微使用包装器Boolean对象执行,但您的选择应基于可读性和基本设计决策而不是“性能”。

答案 2 :(得分:4)

当你需要一个三态变量时,

Boolean会派上用场。

此外,您可能需要查看此autoboxing and unboxing tutorial以及rules for how it works

答案 3 :(得分:1)

这是一个非常奇怪的问题,因为false是基本类型boolean的值,而Boolean.FALSE是引用类型Boolean的变量。它的值是对Boolean类型的对象的引用,其内部布尔状态为false

答案 4 :(得分:1)

关于效果,Boolean.FALSE将返回Boolean对象,这可能会让您更灵活地使用。

原始备选方案占用的内存较少

答案 5 :(得分:0)

Boolean是布尔基元类型的包装类,与int的整数相同。

布尔值有许多方法可以在基本类型boolean

中使用

http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html

答案 6 :(得分:0)

首先,如果您不清楚这一点,您需要知道在Java中数字不能隐式地转换为布尔值,例如你不能编译像:

int a = 1;
if(a){
    //something, something
}

其次,关于性能的一些考虑。 总是需要权衡。

使用基本类型boolean时,性能应该更好,因为您直接使用,这可能是truefalse(显然,字节编码) )。

使用对象类型Boolean时,变量/字段将保存一个值,但该值不能立即使用,因为该值实际上是对象的引用,因此可能会降低性能。当然,在大多数情况下,这种惩罚并不重要。而且,如果您开发一个时间关键型应用程序,很可能您不使用Java :)。尽管如此,使用对象类型可能会在开发过程中带来一些好处并在用例实现中带来安全性(例如,它允许空值,这对于将JPA实体映射到关系表并且存在允许空值的位类型列时至关重要;这仅是一种情况,其中对象类型更好)。

最后,要注意拳击/取消拳击,它允许开发人员在预期boolean类型变量的所有地方使用Boolean类型变量(反之亦然)。

答案 7 :(得分:0)

Boolean a = null;
if (a) {
   // NullPointerException
}
if (a != false) {
   // NullPointerException
}
// Caution, comparing by reference, meaning 2 Booleans with same value could be different
if (a != Boolean.FALSE) {
    System.out.println("But this one works"); 
}