布尔与Java中的布尔值

Java中的Integerint有关于int讨论。 前者的默认值为null而后者为0Booleanboolean怎么样?

我的应用程序中的一个variables可以有0值。 我想使用boolean / Boolean而不是使用int 。 我可以使用Boolean / boolean吗?

是的,你可以使用Boolean / boolean代替。

第一个是Object,第二个是原始types。

  • 首先,你会得到更多有用的方法。
  • 考虑到记忆费用,第二个是便宜的。

现在select你的方式。

Boolean 包装布尔基元types。 在JDK 5及更高版本中,Oracle(或Oracle之前的Sun购买了它们)引入了autoboxing / unboxing ,这基本上允许你这样做

 boolean result = Boolean.TRUE; 

要么

 Boolean result = true; 

编译器本质上是这样做的,

 Boolean result = Boolean.valueOf(true); 

所以,你的答案是肯定的

我有点延伸提供了答案(因为到目前为止,他们专注于他们自己的/人造的术语,侧重于编程一种特定的语言,而不是在创build编程语言背后的大局,一般来说,即事情types安全与内存的考虑因素有所不同):

int不是布尔值

考虑

  boolean bar = true; System.out.printf("Bar is %b\n", bar); System.out.printf("Bar is %d\n", (bar)?1:0); int baz = 1; System.out.printf("Baz is %d\n", baz); System.out.printf("Baz is %b\n", baz); 

与输出

  Bar is true Bar is 1 Baz is 1 Baz is true 

第三行(bar)?1:0上的Java代码(bar)?1:0表示barboolean )不能隐式转换(转换)为int 。 我提出这个问题不是为了说明JVM背后的实现细节,而是指出在低级别考虑(作为内存大小)方面,我们不得不偏好数值而不是types安全。 特别是如果这种types的安全性没有被真正地/完全地用于在布尔types中进行检查的forms

如果value \ in {0,1}然后转换为布尔types,否则抛出exception。

所有只是陈述{0,1} <{-2 ^ 31,..,2 ^ 31 -1}。 看起来像一个矫枉过正的,对吧? types安全在用户定义的types中是非常重要的,而不是隐式的基元转换(尽pipe最后包含在第一个中)。

字节不是types或位

请注意,在内存中,{0,1}范围内的variables将仍然占用至less一个字节或一个字(取决于寄存器的大小,xbits),除非特别注意(例如,很好地包装在内存中 – 8“布尔”位转换为1字节 – 来回)。

通过优先考虑types安全性(比如将值放入特定types的盒子中)而不是额外的值包装(例如,使用位移或算术),可以有效地select编写更less的代码来获得更多的内存。 (另一方面,总是可以定义一个自定义的用户types,这将有利于所有的转换不值得布尔值)。

关键字与types

最后,你的问题是关于比较关键字types 。 我相信,通过使用/ preferring关键字(“标记”为基元 )来覆盖types(使用其他关键字类的常规复合用户可定义类)或换句话说,解释为什么或者如何确切地获得性能是非常重要的

 boolean foo = true; 

 Boolean foo = true; 

第一个“东西”(types)不能被扩展(子类),而不是没有理由。 原始类和包装类的Java术语可以简单地转换为内联值(LITERAL或一个常量,只要有可能推断replace,或者如果不可以,则由编译器直接replace)仍然回退为包装值。

优化是由于琐碎:

“减less运行时间铸造操作=>更快的速度。”

这就是为什么当实际的types推断完成的时候,如果有必要的话(或者转换/转换成这样),它可能(仍然)最终在实例化所有types信息的包装类。

所以, 布尔值布尔值之间的差异正好在编译运行时 (有点远,但几乎如同instanceofgetClass() )。

最后,自动装箱比基元慢

注意Java可以做自动装箱只是一个“语法糖”的事实。 它不加速任何事情,只是让你写更less的代码。 而已。 铸造和包装到types信息容器仍然执行。 出于性能方面的原因,select算术将永远跳过额外的内务pipe理,用types信息创build类实例来实现types安全。 缺乏types安全性是您为了获得性能付出的代价。 对于具有布尔值expression式的代码,types安全性(当您编写较less且因此隐含的代码时)对于if-then-elsestream控制将是至关重要的。

您可以使用布尔常量 – Boolean.TRUEBoolean.FALSE而不是01 。 你可以创build你的variables作为booleantypes,如果原始是你在之后。 这样你就不必创build新的Boolean对象。

基本上布尔表示一个原始数据types,其中布尔表示一个引用数据types。 这个故事是在Java想要成为纯粹的面向对象的时候提供的,它提供了包装类概念来使用原始数据types。

 boolean b1; Boolean b2; 

b1b2不一样。

java.lang.Boolean类将对象中的基本typesboolean的值封装起来。 布尔types的对象包含一个types为布尔型的字段

以下是声明,public final class Boolean extends Object实现了Serializable,Comparable