布尔与Java中的布尔值
Java中的Integer
和int
有关于int
讨论。 前者的默认值为null
而后者为0
。 Boolean
与boolean
怎么样?
我的应用程序中的一个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
表示bar ( boolean )不能隐式转换(转换)为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信息的包装类。
所以, 布尔值和布尔值之间的差异正好在编译和运行时 (有点远,但几乎如同instanceof和getClass() )。
最后,自动装箱比基元慢
注意Java可以做自动装箱只是一个“语法糖”的事实。 它不加速任何事情,只是让你写更less的代码。 而已。 铸造和包装到types信息容器仍然执行。 出于性能方面的原因,select算术将永远跳过额外的内务pipe理,用types信息创build类实例来实现types安全。 缺乏types安全性是您为了获得性能付出的代价。 对于具有布尔值expression式的代码,types安全性(当您编写较less且因此隐含的代码时)对于if-then-elsestream控制将是至关重要的。
您可以使用布尔常量 – Boolean.TRUE
和Boolean.FALSE
而不是0
和1
。 你可以创build你的variables作为boolean
types,如果原始是你在之后。 这样你就不必创build新的Boolean
对象。
基本上布尔表示一个原始数据types,其中布尔表示一个引用数据types。 这个故事是在Java想要成为纯粹的面向对象的时候提供的,它提供了包装类概念来使用原始数据types。
boolean b1; Boolean b2;
b1
和b2
不一样。
java.lang.Boolean类将对象中的基本typesboolean的值封装起来。 布尔types的对象包含一个types为布尔型的字段
以下是声明,public final class Boolean extends Object实现了Serializable,Comparable