咱们都知道,Java语言中有个boolean类型。每一个boolean类型的变量中存储的是一个true或者是false的逻辑值。那么存储这个逻辑值,须要多大的空间呢?从理论上来说,存储这个逻辑值只须要1个位(bit)就能够了,不少教科书上谈到这个问题的时候,也说boolean类型的数据在内存中只占1个位。html
可是稍微有点计算机常识的人都知道:计算机完成寻址操做的时候,是以字节为最小单位进行的。也就是说每次要读取内存中数据的时候,最小只能精确到1个字节,不能单独读取某个位上的信息。若是boolean类型的变量的值只占1个位,计算机每次读取到1个字节的信息,里面会包含8个boolean变量的值。计算机就不得不经过某种算法去肯定这8个值中,哪个才是咱们要找的值。这样作显然很是不合理,由于要完成这个“8选1”的操做又会增长运算工做量。那么Java虚拟机究竟是怎样存储boolean值呢?算法
为了完全说清楚这个问题,咱们还要刨一刨老底。每次JDK出新版本的时候,Java官方都会发布一个对应版本的《虚拟机规范》。在《虚拟机规范》中,对boolean类型的存储有专门的解释,文中说到:“虽然定义了boolean这种数据类型,可是只对它提供了很是有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操做的boolean值,在编译以后都使用Java虚拟机中的int数据类型来代替,而boolean数组将会被编码成Java虚拟机的byte数组,(所以)每一个boolean元素占8位”。编程
按照这样的说法咱们能够得知:boolean类型的数据若是单独使用,占4个字节的空间,而若是存储到boolean数组中,每一个元素又只占1个字节。
紧接着问题又来了:单独使用boolean类型数据的时候,为何要用4个字节来存储呢?用1个或2个字节存储岂不是更节省空间吗?咱们必须知道,当下大部分处理器都是32位的(不是操做系统的32位,而是指CPU硬件),把boolean型数据存储成4个字节(32位),存取效率是最高的。数组
最后还会有小伙伴问:《虚拟机规范》中是这么规定的,但在实现虚拟机的时候,真是按这样的规定来执行吗?为了说清楚这个问题,咱们又要科普一个小常识:世界上并不是只有Oracle一家公司实现了Java虚拟机(JVM),也有其余厂商或机构会发布本身的Java虚拟机实现。这些厂商或机构在本身的虚拟机中,是否彻底按照《规范》的规定来存储boolean型数据就不得而知了。他们会综合考虑运算效率与存储空间两方面的性能。ide
如想系统学习Java编程,能够点击https://edu.51cto.com/lecturer/2256836.html观看我在本站的视频课程,有问题也能够加入个人QQ群291839907一块儿讨论!性能