用java实现布尔模型_布尔与Java中的布尔值

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值