例如。值为6的字节具有位模式00000110。
所以我想知道,因为布尔值也是一个原语,对于值为true和false的位模式是什么。
答案 0 :(得分:6)
在字节码/ VM内部,布尔值表示为字节,位模式00000001为真,00000000为假。但是这些信息并没有像Java开发人员那样购买任何东西,因为你根本无法访问或以其他方式使用Java中的布尔值的数字重新定位,因为Java将它们严格地从数字中分离出来。
编辑:我刚刚再次抬起Java VM Spec,发现我的答案错了。与我之前所说的相反,布尔值在字节代码中存储为CONSTANT_Integer结构,这使得它们占用常量池中数据的4个字节,但由于常量池是统一的,因此任何类中最多可以有2个布尔条目。由于对常量池的引用总是2个字节宽,因此一个布尔数组在字节代码中每个条目占用2个字节。
答案 1 :(得分:3)
是的,正如斯卡弗曼所说:True是1而false是0。
但这并不重要,因为除非你查看程序之外的序列化数据,否则你不太可能在野外看到这些数据。
对于它的价值,常见的Java实现实际上将布尔值存储在整数大小的字段中,即它们在该单个信息位周围有31个零值的填充。一次访问32位比从4中抓取一个字节要快一点,比从一个字节中挖出一个字节要快得多。然而,这种优化使得布尔数组变得非常大。如果你需要处理很多很多位并且需要减少空间,那么最好使用BitSet
。
答案 2 :(得分:2)
如果我没有错,JVM规范并不强制要求如何在内部表示布尔值。内部如何表示值是特定于供应商的,对程序员来说无关紧要,因为这个细节对于在JVM上运行的程序是完全透明的。