本文首發於微信公衆號:程序員喬戈裏html
什麼是boolean類型,根據官方文檔的描述:java
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.
谷歌翻譯一下:程序員
布爾類型:布爾數據類型只有兩個可能的值:真和假。使用此數據類型爲跟蹤真/假條件的簡單標記。這種數據類型就表示這一點信息,可是它的「大小」並非精肯定義
面試
stackoverflow就有關於boolean佔幾個字節的討論。
what-is-the-size-of-a-boolean-variable-in-java
其中有一個高贊回答:編程
/** *出自公衆號:程序員喬戈裏 */ class LotsOfBooleans { boolean a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af; boolean b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf; boolean c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf; boolean d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df; boolean e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef; } class LotsOfInts { int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, aa, ab, ac, ad, ae, af; int b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, ba, bb, bc, bd, be, bf; int c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf; int d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, da, db, dc, dd, de, df; int e0, e1, e2, e3, e4, e5, e6, e7, e8, e9, ea, eb, ec, ed, ee, ef; } public class Test { private static final int SIZE = 100000; public static void main(String[] args) throws Exception { LotsOfBooleans[] first = new LotsOfBooleans[SIZE]; LotsOfInts[] second = new LotsOfInts[SIZE]; System.gc(); long startMem = getMemory(); for (int i=0; i < SIZE; i++) { first[i] = new LotsOfBooleans(); } System.gc(); long endMem = getMemory(); System.out.println ("Size for LotsOfBooleans: " + (endMem-startMem)); System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE))); System.gc(); startMem = getMemory(); for (int i=0; i < SIZE; i++) { second[i] = new LotsOfInts(); } System.gc(); endMem = getMemory(); System.out.println ("Size for LotsOfInts: " + (endMem-startMem)); System.out.println ("Average size: " + ((endMem-startMem) / ((double)SIZE))); // Make sure nothing gets collected long total = 0; for (int i=0; i < SIZE; i++) { total += (first[i].a0 ? 1 : 0) + second[i].a0; } System.out.println(total); } private static long getMemory() { Runtime runtime = Runtime.getRuntime(); return runtime.totalMemory() - runtime.freeMemory(); } }
運行結果segmentfault
Size for LotsOfBooleans: 8257544 Average size: 82.57544 Size for LotsOfInts: 33599984 Average size: 335.99984
Java虛擬機規範一書提到 :數組
boolean值,在編譯以後都使用Java虛擬機中的int數據類型來代替。微信
Java規範中,沒有明確指出boolean的大小。在《Java虛擬機規範》給出了單個boolean佔4個字節,和boolean數組1個字節的定義,具體 還要看虛擬機實現是否按照規範來,因此1個字節、4個字節都是有可能的oracle
References:
[1] 官方文檔的描述: http://docs.oracle.com/javase...
[2] what-is-the-size-of-a-boolean-variable-in-java: https://stackoverflow.com/que...
[3] 因此1個字節、4個字節都是有可能的: https://blog.csdn.net/makinga...this
若是是頭條用戶,能夠在個人頭條號 程序員喬戈裏後臺回覆 資源獲取價值59998元的編程和考研資料
以爲文章不錯的歡迎關注個人WX公衆號: 程序員喬戈裏
我是BAT大廠後臺開發工程師,,專一分享技術乾貨/編程資源/求職面試/成長感悟等,關注送5000G編程資源和本身整理的一份幫助很多人拿下java的offer的面經附答案,免費下載CSDN資源。