false和Boolean.FALSE有什么区别?

Ahm*_*ck' 21 java boolean primitive-types

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

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

Jas*_*n C 32

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

Boolean.TRUE而Boolean.FALSE不是boolean,他们是Boolean.他们是两个静态实例Boolean对应于包装对象boolean的值true和false.

Boolean类似于enum.在TRUE和FALSE实例是通过返回的实例Boolean.valueOf().

至于原始与包装的表现; 没有什么区别,你需要关注.在TRUE与FALSE静态情况下提高性能一点,的javadoc推荐使用Boolean.valueOf(),而不是new Boolean(...)因为这个原因.在true与false布尔值是有点"低级别",但如果你是在它们存储Boolean(而不是boolean),反正这是无关紧要的.

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

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

Boolean a = true;
assert(a == Boolean.TRUE);
Run Code Online (Sandbox Code Playgroud)



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


GGr*_*rec 5

Boolean 当您需要三态变量时会派上用场。

此外,您可能想查看此自动装箱和拆箱教程,以及它的工作原理。


Boh*_*ian 5

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

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

Boolean b = false;
Run Code Online (Sandbox Code Playgroud)

Java的自动装箱会将原语转换为一个对象,因此该false值会丢失,Boolean.FALSE无论如何最终都会结束.

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