专栏首页Java那些事腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知

腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知

---------------第二天--------------

什么是boolean类型,根据官方文档的描述[1]:

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[2] 其中有一个高赞回答:

 /**
 *出自公众号:程序员乔戈里
 */
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个字节都是有可能的[3]

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

------ END ---------

本文分享自微信公众号 - 程序员乔戈里(CXYqiaogeli),作者:乔戈里

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个Java对象到底占用多大内存?

    最近在调研MAT和VisualVM源码实现,遇到一个可疑问题,两者计算出来的对象大小不一致,才有了这样疑惑。

    乔戈里
  • 每天一道剑指offer-二叉树的下一个结点

    https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13&tqId=...

    乔戈里
  • 什么是BIO、NIO和AIO?

    周末午后,在家里面进行电话面试,我问了面试者几个关于IO的问题,其中包括什么是BIO、NIO和AIO?三者有什么区别?具体如何使用等问题,但是面试者回答的并不是...

    乔戈里
  • LeetCode动画 | 37.解数独

    今天分享一个LeetCode题,题号是37,题目标题是解数独,题目标签是散列表和回溯算法。

    我脱下短袖
  • 容器和虚拟机新旧博弈?哪有那么不对付

    自从容器技术出现以后,关于容器将取代虚拟机的言论就时有出现, 并且愈演愈烈。有人说容器技术就是下一场革命,未来会将虚拟机替换掉,但是从调研来看,事实并非如此。容...

    静一
  • Windows环境VMWare WorkStation 12安装步骤

    如果您已经安装好了虚拟机软件,下面文章链接是虚拟机安装Linux操作系统:http://www.jianshu.com/p/9a65e26cb1c7 双击安装文...

    Albert陈凯
  • JSP简要

      本篇知识导图 ?   说起JSP,当年做课程设计什么的都用的这个,虽然技术比较古老,但是还是挺广泛使用的。   JSP是一种前台的展现语言,在mvc里面属于...

    用户1154259
  • 说一道排序题

    关于Python的sorted排序算法,这篇文章讲的比较详细:python sort函数内部实现原理,说到Python使用的是著名的Timesort算法。

    小歪
  • MariaDB非分布式数据库经典案例

    问题现象:tdsql-xxxxxx 库plidb表letterperson字段PrintState被大量置为了‘0’

    owenwtyang_杨文涛
  • windows下安装dig进行dns排障

    注:此文不属于原创,是按经验整理了工具的用法。 windows默认是使用nslookup,有时需要使用dig工具,这里简单进行说明 主要是这3个步骤 1.下载...

    邪恶の大灰

扫码关注云+社区

领取腾讯云代金券