在C ++中,windows.h FALSE
被定义为整数,它对某些特殊逻辑情况有意义,但在Java中,java.lang.Boolean.FALSE
被定义为boolean并赋值为false
public static final Boolean FALSE
和我见过一些人用它。
我的问题:false
和Boolean.FALSE
之间有性能差异吗?一般为什么人们去和Boolean.FALSE
?
见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
静态实例有助于提高性能,而javadocs推荐使用Boolean.valueOf()
而不是new Boolean(...)
。 true
和false
布尔值有点“较低级别”,但如果你将它们存储在Boolean
(而不是boolean
)中,那么它无关紧要。
你应该使用对你的代码最有意义的东西,并导致最好的可读性(并且绝对不会开始考虑微优化,如原始类型和包装类型)。如果您使用的是Boolean
,请使用对象值。如果您使用的是boolean
,请使用原始值。如果你在Boolean
和boolean
之间做出决定,请使用更合适的东西(例如,Boolean
可能是null
,这可能很有用,而且你不能使用原始类型作为泛型类型参数;另一方面,boolean
永远不会是null
,可能同样有用)。
另请注意,自动装箱将原始类型转换为这两个静态Boolean
实例之一,例如:
Boolean a = true;
assert(a == Boolean.TRUE);
顺便说一句,因为你提到它:FALSE
在windows.h
中被定义有两个原因:1)因为windows.h
自从C-only天开始使用,而且C没有本地的bool
类型,2)它是传统的微软实践定义具有已知的显式大小和值的数据类型和值,尤其是用于跨DLL边界(超出此问题的范围)将数据传递到Windows API函数,以及与具有“true”和“false”的不同表示的其他语言集成。这与Java中Boolean.FALSE
的原因完全无关。
false
是一个原始的,Boolean.FALSE
是一个对象,所以它们不是真正的可比性。
如果将false
分配给Boolean
变量,如下所示:
Boolean b = false;
Java的自动装箱会将原语转换为对象,因此false
值会丢失,无论如何你最终会得到Boolean.FALSE
。
在性能方面,使用包装器Boolean
对象使用原始变量会略微超出执行,但您的选择应该基于可读性和基本设计决策而不是“性能”。
当你需要一个三态变量时,Boolean
会派上用场。
此外,你可能想看看这个autoboxing and unboxing tutorial,以及rules for how it works。
这是一个非常奇怪的问题,因为false
是原始类型boolean
的值,而Boolean.FALSE
是引用类型Boolean
的变量。它的值是对Boolean
类型的对象的引用,其内部布尔状态是false
。
在性能方面,Boolean.FALSE
将返回一个Boolean
对象,这可能会让您更灵活地使用它。
原始替代方案占用的内存较少
Boolean
是布尔基元类型的包装类,与int的Integer相同。
Boolean有许多方法可以在基本类型boolean
中使用
http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html
首先,如果您不清楚这一点,您需要知道在Java中数字不能隐式地转换为布尔值,例如你不能编译像:
int a = 1;
if(a){
//something, something
}
第二,关于性能的一些考虑。总是需要权衡。
当使用原始类型boolean
时,性能应该更好,因为你直接使用一个值,即true
或false
(显然,字节编码)。
使用对象类型Boolean
时,变量/字段将保存一个值,但该值不能立即使用,因为该值实际上是对对象的引用,因此您可能会有性能损失。当然,在大多数情况下,这种惩罚并不重要。而且,如果您开发一个时间关键型应用程序,很可能您不使用Java :)。尽管如此,使用对象类型可能会在开发过程中带来一些好处并在用例实现中带来安全性(例如,它允许空值,这对于将JPA实体映射到关系表并且存在允许空值的位类型列时至关重要;这仅是一种情况,其中对象类型更好)。
最后,要注意拳击/取消拳击,这允许开发人员几乎在任何地方使用boolean
类型的变量,而且预期使用Boolean
类型的变量(反之亦然)。
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");
}