false 和 Boolean.FALSE 之间有什么区别?

2022-09-01 12:50:07

在C++被定义为整数,这对于一些特殊的逻辑情况是有意义的,但在Java中被定义为布尔值并分配给false
,我看到有些人使用它。windows.h FALSEjava.lang.Boolean.FALSEpublic static final Boolean FALSE

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


答案 1

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

Boolean.TRUE并且不是,它们是 。它们是两个包装器对象的静态实例,对应于值 和 。Boolean.FALSEbooleanBooleanBooleanbooleantruefalse

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

至于原始与包装器的性能;您不需要担心的区别。和静态实例对性能有一定帮助,javadocs建议使用而不是出于这个原因。和布尔值有点“低级”,但如果你将它们存储在(而不是)中,那无论如何都是无关紧要的。TRUEFALSEBoolean.valueOf()new Boolean(...)truefalseBooleanboolean

你应该使用对你的代码最有意义并导致最佳可读性的任何一个(绝对不要开始考虑微优化,如原始与包装类型)。如果使用 ,请使用对象值。如果使用 ,请使用基元值。如果你在 vs 之间做出决定,请使用任何更合适的方法(例如,a can be ,这可能很有用,而且你不能对泛型类型参数使用基元类型;另一方面,a 永远不可能是同样有用的)。BooleanbooleanBooleanbooleanBooleannullbooleannull

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

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



顺便说一句,既然你提到了它:定义有两个原因:1)因为自C-only时代以来一直在使用,而C没有本机类型,2)传统的Microsoft做法是定义具有已知,显式大小和值的数据类型和值,特别是用于跨DLL边界将数据传递到Windows API函数(超出本问题的范围)以及与具有不同语言的其他语言集成。“真”和“假”的表示。它与Java中的原因完全无关。FALSEwindows.hwindows.hboolBoolean.FALSE


答案 2

false是一个基元,是一个对象,所以它们并不具有可比性。Boolean.FALSE

如果赋值给变量,如下所示:falseBoolean

Boolean b = false;

Java的自动装箱是为了将基元转换为对象,因此值丢失,无论如何你最终都会得到。falseBoolean.FALSE

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