布尔数据类型仅计算为true
或false
,因此它总是只占用一位内存。那么为什么需要额外的7位内存,这不是浪费内存吗?
答案 0 :(得分:13)
我认为它可能需要超过8 bits。这取决于JMV。"在Oracle JVM原语boolean
需要8位,原因是支持有限且缺乏优化。
另请阅读:What is the size of a boolean variable in Java?
The Java Tutorials - Primitive Data Types之后
boolean :布尔数据类型只有两个可能的值:true和false。将此数据类型用于跟踪真/假条件的简单标志。此数据类型代表一位信息,但其大小"大小"不是精确定义的东西。
The Java® Virtual Machine Specification之后
虽然Java虚拟机定义了一个布尔类型,但只有提供 对它的支持非常有限。仅没有Java虚拟机指令 致力于布尔值的操作。相反,Java中的表达式 对布尔值进行操作的编程语言被编译为使用值 Java虚拟机int数据类型。
在Oracle的Java虚拟机实现中,Java中的布尔数组 编程语言编码为Java虚拟机字节数组,使用8位 布尔元素。
例如Boolean类型在内存中看起来像这样
header: 8 bytes
value: 1 byte
padding: 7 bytes
------------------
sum: 16 bytes
作为boolean[]
的替代方案,您可以使用java.util.BitSet。
为什么很难将布尔值存储为1位?阅读Vlad from Moscow answer。你不能解决一点内存。
答案 1 :(得分:5)
取决于内存的可寻址性。最不可寻址的单位是字节。您可以获取一个字节的地址并使用它进行地址算术运算。此外,还有内置的机器命令,可以使用字节操作。但是,不可能取一点地址并执行地址算术。在任何情况下,首先你必须计算包含目标位的字节的地址,并应用额外的机器命令,这些命令取决于设置或重置该位的字节中位的位置。
答案 2 :(得分:3)
请参阅Oracle’s Java Virtual Machine implementation:
虽然Java虚拟机定义了一个布尔类型,但它只是 为它提供非常有限的支持。没有Java Virtual 机器指令仅专用于布尔值的操作。 而是在Java编程语言中运行的表达式 编译布尔值以使用Java虚拟机的值 int数据类型。
Java虚拟机使用1来编码布尔数组组件 表示true,0表示false。哪里有Java编程 语言布尔值由编译器映射到Java的值 虚拟机类型为int,编译器必须使用相同的编码。
答案 3 :(得分:1)
您可以看到对此处使用的实际尺寸的讨论:
What is the size of a boolean variable in Java?
但基本上它归结为内存效率和性能之间的权衡 - 特别是当你考虑到类中的每个其他变量都需要开始字对齐时。
只有当您要打包多个较小的对象时才能将它们打包得更小,然后您仍然需要留下填充以对齐下一个成员。
答案 4 :(得分:0)
这不是浪费记忆吗?
是的,它浪费了7位,但是我们每个人都知道一个字节是最小的存储单元,JVM认为它是1个字节。