目前有三种说法:
一、1个bit(位)(1/8个字节)
此说法只在存储理论上成立。因为boolean类型的值只有true和false两种逻辑状态值,可以用1和0来表示,而在内存中0和1按位算仅需1位(bit)即可代表这个逻辑。但很明显,这是很难说通的,因为计算机单次处理数据时绝对不可能一个bit一个bit的来。
二、1个字节
当boolean类型数据是数组中的元素时,如boolean[] b = new boolean[10]; 此时每一个boolean在JVM中占一个字节。
从计算机处理数据的最小单位的角度出发,虽然编译后1和0只需占用1位空间,但计算机处理数据的最小单位是1个字节,1个字节等于8位,实际存储的空间是:用1个字节中的最低位bit来存储,其他7位用0填补,即如果值是true的话则存储的二进制为:0000 0001,如果是false的话则存储的二进制为:0000 0000。
三、4个字节
在《Java虚拟机规范》一书中的描述:“虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持”。接着又说——
“在Java虚拟机中没有任何供boolean值专用的字节码指令,
Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,
而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位”
也就是说JVM规范指出,会将Java表达式中的boolean类型数据当做int型数据处理,也就是4字节。但对于boolean数组当做byte数组处理,也就是每个boolean类型元素1个字节,这样我们可以得出boolean类型单独使用时占了4个字节,在数组中是确定的1个字节。
这又引出一个问题:那虚拟机为什么要在boolean类型数据在表达式中使用时就用int来代替boolean呢?为什么不用byte或short,这样不是更节省内存空间吗。经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),32 位 CPU 使用 4 个字节是最为节省的,哪怕你是 1 个 bit 他也是占用 4 个字节。因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。
最后的总结:
JAVA规范中没有定义boolean类型的大小,但其到底占用了几个字节,还是得依赖于虚拟机的具体实现,符合规范的虚拟机就是1字节或者4字节。
当Boolean类型数据是数组中的元素时,就是1字节。
当Boolean类型数据是在Java语言表达式中时,就是4字节。
《Java虚拟机规范》原文:
Instead, expressions in the Java programming language that operate on boolean values are compiled to use values of the Java virtual machine int data type.
Where Java programming language boolean values are mapped by compilers to values of Java virtual machine type int, the compilers must use the same encoding. But:Java virtual machine type int, whose values are 32-bit signed two's-complement integers。
Arrays of type boolean are accessed and modified using the byte array instructions
In Sun's JDK releases 1.0 and 1.1, and the Java 2 SDK, Standard Edition, v1.2, boolean arrays in the Java programming language are encoded as Java virtual machine byte arrays, using 8 bits per boolean element.