我有点延伸提供了答案(因为到目前为止,他们专注于他们自己的/人造的术语,侧重于编程一种特定的语言,而不是在创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}
字节不是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控制将是至关重要的。