在C ++中windows.h FALSE
被定义为整数,这对某些特殊逻辑情况有意义,但在Java java.lang.Boolean.FALSE
中定义为boolean并赋值为false
public static final Boolean FALSE
我看到有些人使用它。
我的问题:false
和Boolean.FALSE
之间是否存在性能差异?一般来说为什么人们去Boolean.FALSE
?
答案 0 :(得分:30)
请参阅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
)中,则无关紧要。< / p>
你应该使用对你的代码最有意义的东西,并导致最佳的可读性(并且绝对不会开始考虑微优化,如原始类型和包装类型)。如果您使用的是Boolean
,请使用对象值。如果您使用的是boolean
,请使用原始值。如果您要在Boolean
与boolean
之间做出决定,请使用更合适的内容(例如,Boolean
可以是null
,这可能很有用,而且您也无法使用泛型类型参数的基本类型;另一方面,boolean
永远不会成为null
,这可能同样有用。)
另请注意,自动装箱会将基元类型转换为这两个静态Boolean
实例中的一个,例如:
Boolean a = true;
assert(a == Boolean.TRUE);
顺便说一下,既然你提到了它:FALSE
在windows.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
时,性能应该更好,因为您直接使用值,这可能是true
或false
(显然,字节编码) )。
使用对象类型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");
}