背景

最近在复盘Java基础知识,看到基础数据类型这一章节,有一张图片是这样的。
布尔值占几个字节 - 图1
比较好奇,为什么其他类型都有字节标识,唯独boolean没有,不是只占用1bit ~ 1位的吗 ?

找答案

出处1 ~《疯狂Java讲义(3版)》

布尔值占几个字节 - 图2
一个boolean类型占用8位 = 1字节

出处2 ~ Java官网

1 原始类型

Primitive Data Types

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.

解释一下:

布尔数据类型只有两个可能的值:true和false。 将此数据类型用于跟踪真/假条件的简单标志。 此数据类型表示一位信息,但其“大小”不是精确定义的内容。

2 jdk 布尔类型

地址2:jdk specs文档
我对比了jdk8, jdk11 和 jdk12 对于boolean类型的说明是完全一样的,故只贴出jdk12的图
布尔值占几个字节 - 图3
翻译一下:

虽然Java虚拟机定义了一个boolean类型,但它只为它提供了非常有限的支持。没有Java虚拟机指令专门用于对boolean值的操作。相反,Java编程语言中对boolean值进行操作的表达式被编译为使用Java虚拟机int数据类型的值。

Java虚拟机直接支持boolean数组。它的newarray指令可以创建boolean数组。使用byte数组指令baload和bastore访问和修改类型为boolean的数组。

在Oracle的Java虚拟机实现中,Java编程语言中的boolean数组被编码为Java虚拟机byte数组,每个布尔元素使用8位。

Java虚拟机使用1表示boolean数组组件的true,0表示false。其中Java编程语言布尔值由编译器映射到Java虚拟机类型int的值,编译器必须使用相同的编码。

结论

  1. boolean类型被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节
    2. boolean数组在Oracle的JVM中,编码为byte数组,每个boolean元素占用8位=1字节
    3. (待考证)boolean数组在非Oracle JVM里面,占用字节数也许不是1字节

    引用原文

    ———————————————— 版权声明:本文为CSDN博主「HypocrisyC」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/amoscn/article/details/97377833