为什么布尔数据类型需要8位?
布尔数据类型仅计算为true
或false
,因此它总是只占用一位内存。 那么为什么需要额外的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字节。