Java中布尔(boolean)类型占⽤多少个字节?

硅谷探秘者 java基础 469 0 0

  为什么要问这个问题,⾸先在Java中定义的⼋种基本数据类型中,除了其它七种类型都有明确的内存占⽤字节数外,就 boolean 类型没有给出具体的占⽤字节数,因为对虚拟机来说根本就不存在 boolean 这个类型,boolean 类型在编译后会使⽤其他数据类型来表⽰,那boolean类型究竟占⽤多少个字节?带着疑问,随便⽹上⼀搜,答案五花⼋门,基本有以下⼏种:

1、1个bit

  理由是boolean类型的值只有true和false两种逻辑值,在编译后会使⽤1和0来表⽰,这两个数在内存中只需要1位(bit)即可存储,位是计算机最⼩的存储单位。

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位”。这样我们可以得出boolean类型占了单独使⽤是4个字节,在数组中⼜是1个字节。
  显然第三条是更准确的说法,那虚拟机为什么要⽤int来代替boolean呢?为什么不⽤byte或short,这样不是更节省内存空间吗。⼤多数⼈都会很⾃然的这样去想,我同样也有这个疑问,经过查阅资料发现,使⽤int的原因是,对于当下32位的处理器(CPU)来说,⼀次处理数据是32位(这⾥不是指的是32/64位系统,⽽是指CPU硬件层⾯),具有⾼效存取的特点。

最后的总结

  布尔类型:布尔数据类型只有两个可能的值:真和假。使⽤此数据类型为跟踪真/假条件的简单标记。这种数据类型就表⽰这⼀点信息,但是它的“⼤⼩”并不是精确定义的。
  可以看出,boolean 类型没有给出精确的定义,《Java虚拟机规范》给出了4个字节,和 boolean 数组 1 个字节的定义,具体还要看虚拟机实现是否按照规范来,所以 1 个字节、4 个字节都是有可能的。这其实是运算效率和存储空间之间的博弈,两者都⾮常的重要。

猜你喜欢
java基础 3654 java数据java数据基本数据数值整数(byte,short,int,long)浮点(float,double)(chart)(boolean)引用
java虚拟机(jvm) 2866 Java虚拟机的指令由一长度的、代表着某种特定操作含义的数(称为操作码,Opcode)以及跟随其后的零至代表此操作所需参数(称为操作数,Operands)而构成。基本数据1、除了
java基础 4338 javabyte相加超出范围变负数解析例: @Test publicvoidt(){ byteb=127; b+=127; System.out.println(b); }最终运行得出的
weblog 2680 变量可以直接分配给一值。它们是从System.ValueType派生的。 值直接包含数据。比如int、char、float,它们分别存储数符、浮点数。当您声明一int时,系
算法基础 1303 如果一实现了一接口,如何获取接口的实际importjava.lang.reflect.ParameterizedType; importjava.lang.reflect.Type
java虚拟机(jvm) 4987 1.内部名在许情况下,一种只能是或接口。例如,一的超、由一实现的接口,或者由一方法抛出的异常就不能是基元或数组,必须是或接口。这些在已编译用内部名表示
java虚拟机(jvm) 1634 分为三块区域:对象头(Header)、实例数据(InstanceData)和对齐填充(Padding)。1.MarkWord(标记段):对象的MarkWord部分4,其内容是一系列的标记位,比
weblog 558 mysql整数的范围MySQL支持种数据,大致可以分为三:数值、日期/时间和符串(符)。其,整数包括:TINYINT、SMALLINT、MEDIUMINT、INT和
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2 2022年10月  2
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。