1. 程式人生 > >Java中boolean型別到底佔用多少個位元組?

Java中boolean型別到底佔用多少個位元組?

(1)什麼是boolean型別,根據官方文件的描述(http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html):

boolean: The boolean data type has only two possible values: true and false. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.

布林型別:布林資料型別只有兩個可能的值:真和假。使用此資料型別為跟蹤真/假條件的簡單標記。這種資料型別就表示這一點資訊,但是它的“大小”並不是精確定義的。

也就是說,java規範中,沒有明確指出boolean的大小。

(2)如果要分大小,那麼到底佔幾個位元組呢?通過搜查各類資料(借鑑了一些大神的內容),發現有以下3種說法:

1、1個bit(1/8個位元組)
理由:boolean型別的值只有true和false兩種邏輯值,在編譯後會使用1和0來表示,這兩個數在記憶體中按位算,僅需1位(bit)即可儲存,位是計算機最小的儲存單位。在傳智播客java基礎班中也有有此理由(複習時所參考的視訊)。


2、1個位元組
理由:雖然編譯後1和0只需佔用1位空間,但計算機處理資料的最小單位是1個位元組,1個位元組等於8位,實際儲存的空間是:用1個位元組的最低位儲存,其他7位用0填補,如果值是true的話則儲存的二進位制為:0000 0001,如果是false的話則儲存的二進位制為:0000 0000。

3、4個位元組
理由:在《Java虛擬機器規範》一書中的描述:“雖然定義了boolean這種資料型別,但是隻對它提供了非常有限的支援。在Java虛擬機器中沒有任何供boolean值專用的位元組碼指令,Java語言表示式所操作的boolean值,在編譯之後都使用Java虛擬機器中的int資料型別來代替,而boolean陣列將會被編碼成Java虛擬機器的byte陣列,每個元素boolean元素佔8位”。也就是說JVM規範指出boolean當做int處理,也就是4位元組,boolean陣列當做byte陣列處理,這樣我們可以得出boolean型別佔了單獨使用是4個位元組,在陣列中是確定的1個位元組。

如果認同第三條,那麼存在問題:那虛擬機器為什麼要用int來代替boolean呢?為什麼不用byte或short,這樣不是更節省記憶體空間嗎。經過查閱資料發現,使用int的原因是,對於當下32位的處理器(CPU)來說,一次處理資料是32位(這裡不是指的是32/64位系統,而是指CPU硬體層面),32 位 CPU 使用 4 個位元組是最為節省的,哪怕你是 1 個 bit 他也是佔用 4 個位元組。因為 CPU 定址系統只能 32 位 32 位地定址,具有高效存取的特點。

4、It depends on Java virtual machine.這取決於java虛擬機器 。

總結:java規範中,沒有明確指出boolean的大小。在

《Java虛擬機器規範》給出了4個位元組,和boolean陣列1個位元組的定義,具體還要看虛擬機器實現是否按照規範來,所以1個位元組、4個位元組都是有可能的。

注:謝各位大神的各種見解。