1. 程式人生 > >騰訊面試官問我Java中boolean型別佔用多少個位元組?我說一個,面試官讓我回家等通知

騰訊面試官問我Java中boolean型別佔用多少個位元組?我說一個,面試官讓我回家等通知

本文首發於微信公眾號:程式設計師喬戈裡







什麼是boolean型別,根據官方文件的描述:

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();
    }
}

執行結果

Size for LotsOfBooleans: 8257544
Average size: 82.57544
Size for LotsOfInts: 33599984
Average size: 335.99984




Java虛擬機器規範一書提到 :

  • 在Java虛擬機器中沒有任何供 boolean值專用的位元組碼指令,Java語言表示式所操作的
    boolean值,在編譯之後都使用Java虛擬機器中的int資料型別來代替。
  • Java虛擬機器直接支援 boolean型別的陣列,虛擬機器的 navarra指令參見第6章的newarray小節可以建立這種陣列。boolean型別陣列的訪問與修改共用byte型別陣列的baload和 bastore指令。

  • 因為在虛擬機器規範中說了,boolean值在編譯之後都使用Java虛擬機器中的int資料型別來代替,而int是4個位元組,那麼boolean值就是4個位元組。
  • boolean型別陣列的訪問與修改共用byte型別陣列的baload和 bastore指令,因為兩者共用,只有兩者位元組一樣才能通用呀,所以byte陣列中一個byte是1個位元組,那麼boolean陣列中boolean是1個位元組。
  • 總結:boolean在陣列情況下為1個位元組,單個boolean為4個位元組。



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

References:
[1] 官方文件的描述: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
[2] what-is-the-size-of-a-boolean-variable-in-java: https://stackoverflow.com/questions/383551/what-is-the-size-of-a-boolean-variable-in-java
[3] 所以1個位元組、4個位元組都是有可能的: https://blog.csdn.net/makingadream/article/details/53100237

如果是頭條使用者,可以在我的頭條號程式設計師喬戈裡後臺回覆 資源獲取價值59998元的程式設計和考研資料
覺得文章不錯的歡迎關注我的WX公眾號:程式設計師喬戈裡
我是BAT大廠後臺開發工程師,,專注分享技術乾貨/程式設計資源/求職面試/成長感悟等,關注送5000G程式設計資源和自己整理的一份幫助不少人拿下java的offer的面經附答案,免費下載CSDN資源。

相關推薦

面試Javaboolean型別佔用多少位元組一個面試回家通知

本文首發於微信公眾號:程式設計師喬戈裡 什麼是boolean型別,根據官方文件的描述: boolean: The boolean data type has only two possible values: true and false. Use this data type

Javaboolean型別佔用多少位元組嗎?

是一位,還是一位元組還是四位元組?欲知詳情,請看下文。 文章源自(轉載學習分享,侵刪):【馬劍威-你真的知道Java中boolean型別佔用多少個位元組嗎?】 為什麼要問這個問題,首先在Java中定義的八種基本資料型別中,除了其它七種型別都有明確的記憶體佔用位元組數外,就boolean型別沒

面試Java的鎖有哪些?以及區別”跪了

讀寫鎖 queue get 吞吐量 參考 示例 事情 自動 高並發 在讀很多並發文章中,會提及各種各樣鎖如公平鎖,樂觀鎖等等,這篇文章介紹各種鎖的分類。介紹的內容如下: 公平鎖/非公平鎖 可重入鎖 獨享鎖/共享鎖 互斥鎖/讀寫鎖 樂觀鎖/悲觀鎖 分段鎖 偏

Javaboolean型別到底佔用多少位元組

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

javaDate型別到MongoDB日期轉換問題2018-03-01T16:00:00.000Z少8小時問題應該是3月2號才對

一種:String dt = "2018年3月2日"; SimpleDateFormat sd = new SimpleDateFormat("yyyy年MM月dd日"); //sd.setCalendar(new GregorianCalendar(new SimpleTi

Java程式設計師:因為不太瞭解JVM面試先回去通知...

群裡一小夥伴抱著僥倖心裡,投了阿里簡歷,本來不抱什麼希望,意外中收到了螞蟻的面試通知,對這哥們來說,簡直“受寵若驚”。不過,他心態

面試:Mybatis的TypeHandler你用過嗎?

持續原創輸出,點選上方藍字關注我吧 目錄 前言環境配置什麼是TypeHandler? 如何自定義?如何將其新增到Mybatis中?XML檔案中如何指定TypeHandler? 原始碼中如何執行TypeHandler? 入參如何轉換?結果如何轉換?總結 總結 前言 相信大家用Mybatis這個框架至

視頻嵌入到html

str 打開 網站 wan logs html src allow baidu -------------------------------------------------------------------------------------------------

阿裏巴巴、百度、都在用的Java架構師知識體系

是我 經驗 根據 協同 ons tools 公司 ces sha 一、源碼分析 源碼分析是一種臨界知識,掌握了這種臨界知識,能不變應萬變,源碼分析對於很多人來說很枯燥,生澀難懂。 源碼閱讀,我覺得最核心有三點:技術基礎+強烈的求知欲+耐心。 我認為是閱讀源碼的最核心驅動力。

【小家javaJava對時間戳相加減的問題(向前推100天答案卻匪夷所思)

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9

面試)在聊Java的equals方法

java規範中equals方法特徵 自反性(對於任何非空引用x, x.equals(x) 返回true;) 對稱性(對於任何引用x, y, 當且僅當y.equals(x) 返回true, x.equals(y)返回true;) 傳遞性(對於任何引用x, y, z, 若x.equals(y)返回true,

旗下子公司招聘java中高階專案經理大資料開發經理

本招聘11月前有效 地點:上海 大資料研發經理 薪資:30-40K 職位描述: 1、負責公司大資料平臺的規劃與建設。 2、組建大資料領域技術團隊,以資料為依據向運營提供決策建議。 3、負責機器學習產品總體架構,攻克技術難關和主導關鍵技術決策。 4、負責底層系統的

開發崗筆試題Java

第一題:public class Main {    public static void main(String[] args) {Scanner sc = new Scanner(System.in);        long n = sc.nextInt();     

Python3 +Scrapy 爬取控股股票資訊存入資料庫

目標網站:http://quotes.money.163.com/hkstock/cwsj_00700.html每支股票都有四個資料表找到這四個資料表的資訊所在資料名第一條到第三條資料所在其他三個表也是這樣子尋找,找到資料後,就可以動手爬取了。於2018\3\17 重寫。一.

阿里巴巴、百度、都在用的Java架構師知識體系

一、原始碼分析 原始碼分析是一種臨界知識,掌握了這種臨界知識,能不變應萬變,原始碼分析對於很多人來說很枯燥,生澀難懂。 原始碼閱讀,我覺得最核心有三點:技術基礎+強烈的求知慾+耐心。 我認為是閱讀原始碼的最核心驅動力。我見到絕大多數程式設計師,對學習的態度,基本上就是這

JAVA型別和引用型別的不同(面試常考)

轉載:https://www.cnblogs.com/1ming/p/5227944.html1、 JAVA中值型別和引用型別的不同?[定義] 引用型別表示你操作的資料是同一個,也就是說當你傳一個引數給另一個方法時,你在另一個方法中改變這個變數的值,那麼呼叫這個方法是傳入的變

雲centos7.3搭建java web環境

1、先下載tomcat(apache-tomcat-8.5.31.tar.gz)和jdk(jdk-8u161-linux-x64.tar.gz)。 2、xshell連上伺服器,輸入 cd /usr mkdir java 使用xftp分別將下載好的jdk

雲 Centos7.0 配置JAVA執行環境 (jdk8+tomcat7+mysql)

(一)配置JAVA環境 1.檢視是否聯網 2. 檢視yum庫中的Java安裝包 yum -y list java* 輸入之後回車,會看到各種不同版本的jdk包 3. 使用yum安

機器翻譯非官方Demo(Java版)

        這幾天試用一下騰訊的機器翻譯,按照官方文件操作,一直都未成功。在網友的幫助下,再加上很多次的嘗試,終於能呼叫成功了。在此將程式碼貼出來,作為非官方Demo供大家作為參考。 package com.frank.test; import com.alibaba

首席架構師:Java程序員四階段成長路線少走彎路

一起 finalize ora blog 模塊 col 垃圾收集器 數據庫隔離級別 國際 有這麽一位Java大牛 他是前 Oracle 首席工程師,負責過北京Java核心類庫、國際化、分發服務等技術團隊的組建。大家都知道,Java 就是 Oracle 公司的,他對Java的