Java千問:你知道Java語言布爾型數據到底佔多大空間嗎?

我們都知道,Java語言中有個boolean類型。每個boolean類型的變量中存儲的是一個true或者是false的邏輯值。那麼存儲這個邏輯值,需要多大的空間呢?從理論上來講,存儲這個邏輯值只需要1個位(bit)就可以了,很多教科書上談到這個問題的時候,也說boolean類型的數據在內存中只佔1個位。

但是稍微有點計算機常識的人都知道:計算機完成尋址操作的時候,是以字節爲最小單位進行的。也就是說每次要讀取內存中數據的時候,最小隻能精確到1個字節,不能單獨讀取某個位上的信息。如果boolean類型的變量的值只佔1個位,計算機每次讀取到1個字節的信息,裏面會包含8個boolean變量的值。計算機就不得不通過某種算法去確定這8個值中,哪一個纔是我們要找的值。這樣做顯然非常不合理,因爲要完成這個“8選1”的操作又會增加運算工作量。那麼Java虛擬機到底是怎樣存儲boolean值呢?

爲了徹底說清楚這個問題,我們還要刨一刨老底。每次JDK出新版本的時候,Java官方都會發佈一個對應版本的《虛擬機規範》。在《虛擬機規範》中,對boolean類型的存儲有專門的解釋,文中說到:“雖然定義了boolean這種數據類型,但是隻對它提供了非常有限的支持。在Java虛擬機中沒有任何供boolean值專用的字節碼指令,Java語言表達式所操作的boolean值,在編譯之後都使用Java虛擬機中的int數據類型來代替,而boolean數組將會被編碼成Java虛擬機的byte數組,(因此)每個boolean元素佔8位”。

按照這樣的說法我們可以得知:boolean類型的數據如果單獨使用,佔4個字節的空間,而如果存儲到boolean數組中,每個元素又只佔1個字節。

緊接着問題又來了:單獨使用boolean類型數據的時候,爲什麼要用4個字節來存儲呢?用1個或2個字節存儲豈不是更節省空間嗎?我們必須知道,當下大部分處理器都是32位的(不是操作系統的32位,而是指CPU硬件),把boolean型數據存儲成4個字節(32位),存取效率是最高的。

最後還會有小夥伴問:《虛擬機規範》中是這麼規定的,但在實現虛擬機的時候,真是按這樣的規定來執行嗎?爲了說清楚這個問題,我們又要科普一個小常識:世界上並非只有Oracle一家公司實現了Java虛擬機(JVM),也有其他廠商或機構會發布自己的Java虛擬機實現。這些廠商或機構在自己的虛擬機中,是否完全按照《規範》的規定來存儲boolean型數據就不得而知了。他們會綜合考慮運算效率與存儲空間兩方面的性能。

如果想系統學習Java編程,可以點擊這裏觀看我的視頻課程,有問題也可以加入我的QQ羣291839907一起討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章