2010-01-17 13 views
5

正如我們所知,java變量是指定類型的位持有者。對於基元,位表示一個數值。在Java中布爾的位模式(變量值)?

例如。一個值爲6的字節的位模式爲00000110.

所以我想知道布爾值也是一個原語,它的值爲true和false的位模式是什麼。

+0

我很好奇你希望用什麼樣的方式來回答問題。 – 2010-01-19 21:47:58

回答

6

內部在字節碼/ VM中,布爾值表示爲字節,00000001爲真,00000000爲假。但是這些信息並不像Java開發人員那樣爲您購買任何東西,因爲您無法訪問或以其他方式使用Java中的布爾值數據阻止,因爲Java會嚴格區分數字。

編輯:我只是擡起Java VM Spec並發現我的答案是錯誤的。與我之前說的相反,布爾值以字節代碼的形式存儲爲CONSTANT_Integer結構體,這使得它們在常量池中佔用4個字節的數據,但由於常量池是統一的,因此在任何類中最多可以有2個布爾條目。由於對常量池的引用總是2個字節寬,所以在字節碼中每個條目佔用2個字節的布爾值。

3

是的,正如skaffman說:真爲1,假爲0

但是,這並不重要,因爲除非你看看你的程序之外的序列化的數據,你不可能看到過這些值在野外。

通常的Java實現實際上是將整數大小的字段中的布爾值存儲起來,也就是說,它們在該單個信息位周圍填充了31個零值。每次訪問32位比從4中獲取一個字節快一點,而且比從一個字節中挖掘出一位更快。儘管如此,這種優化使得布爾值數組煩人的大。如果你有許多需要處理的位,並且需要減少空間,那麼最好使用BitSet

2

如果我沒有錯誤JVM規範沒有規定布爾值必須如何在內部表示。內部表示的值是供應商特定的,對程序員無關緊要,因爲這些細節對於通過JVM運行的程序是完全透明的。

+0

你可能是對的。但是當JVM之間的序列化和通信發揮作用時會發生什麼?無論內部如何表示值,都必須有一個綁定標準來允許不同的JVM識別彼此的布爾(和其他)值,對嗎? – 2010-01-17 18:09:31

+0

這是一個有趣的點卡爾。如你所說的,必須有一些綁定標準......但我恐怕不能對此進行評論..我不知道 – Aadith 2010-01-17 18:26:07

+0

不,它不是供應商特定的 - false是0,true是1.示例:編譯此類,使用javap -p -c反編譯它:class Test {boolean t(){return true;} boolean f(){return false;}} – 2015-03-18 11:02:01