false和Boolean.FALSE有什么区别?

问题描述 投票:20回答:8

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

我的问题:falseBoolean.FALSE之间有性能差异吗?一般为什么人们去和Boolean.FALSE

java boolean primitive-types
8个回答
30
投票

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

Boolean.TRUEBoolean.FALSE不是boolean,他们是Boolean。它们是两个Boolean包装对象的静态实例,对应于booleantruefalse

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

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

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

另请注意,自动装箱将原始类型转换为这两个静态Boolean实例之一,例如:

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


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


5
投票

false是一个原始的,Boolean.FALSE是一个对象,所以它们不是真正的可比性。

如果将false分配给Boolean变量,如下所示:

Boolean b = false;

Java的自动装箱会将原语转换为对象,因此false值会丢失,无论如何你最终会得到Boolean.FALSE

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


4
投票

当你需要一个三态变量时,Boolean会派上用场。

此外,你可能想看看这个autoboxing and unboxing tutorial,以及rules for how it works


1
投票

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


1
投票

在性能方面,Boolean.FALSE将返回一个Boolean对象,这可能会让您更灵活地使用它。

原始替代方案占用的内存较少


0
投票

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

Boolean有许多方法可以在基本类型boolean中使用

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


0
投票

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

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

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

最后,要注意拳击/取消拳击,这允许开发人员几乎在任何地方使用boolean类型的变量,而且预期使用Boolean类型的变量(反之亦然)。


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"); 
}
© www.soinside.com 2019 - 2024. All rights reserved.