为什么布尔数据类型需要8位?

布尔数据类型仅计算为truefalse ,因此它总是只占用一位内存。 那么为什么需要额外的7位内存,这不是浪费内存吗?

我认为它可能需要超过8 位 。 这取决于JMV。“在Oracle JVM原语boolean需要8位, 原因是有限的支持和缺乏优化

另请阅读: Java中布尔变量的大小是多少?

在Java教程之后 – 原始数据类型

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

在Java®虚拟机规范之后

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

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

例如, 布尔类型在内存中看起来像这样

 header: 8 bytes value: 1 byte padding: 7 bytes ------------------ sum: 16 bytes 

作为boolean[]的替代,您可以使用例如java.util.BitSet 。

为什么难以将布尔值存储为1位? 从莫斯科回答弗拉德 。 你不能解决一点内存。

它取决于内存的可寻址性。 最不可寻址的单位是字节。 您可以获取一个字节的地址并使用它进行地址算术运算。 此外,还有内置的机器命令,可以使用字节操作。 但是,不可能取一点地址并执行地址算术。 在任何情况下,首先必须计算包含目标位的字节的地址,并应用其他机器命令,这些命令取决于设置或复位该位的字节中位的位置。

请参阅Oracle的Java虚拟机实现 :

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


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

你可以看到这里使用的实际大小的讨论:

Java中布尔变量的大小是多少?

但基本上它归结为内存效率和性能之间的权衡 – 特别是当你认为类中的每个其他变量都需要开始字对齐时。

只有在要打包多个较小的对象时才能将它们打包得更小,然后仍然需要留下填充以对齐下一个成员。

这不是浪费记忆吗?

是的,它浪费了7位,但是我们每个人都知道一个字节是最小的存储单元,JVM称它是1字节。