开头
这个标题的引入其实就是因为一件很搞笑的事。我今天在寝室写作业,突然听见室友的对话。大概如下:
室友a:哎,这个boolean到底是个什么东西哦?
室友b: 不是个东西(开玩笑)
室友a: 之前的我都学会了
室友b: 扯,我不信
室友a: 还是要打好基础啊
室友a:(查了网络)哦,原来boolean类型占一个字节啊
我当时听到这句话就心里觉得好搞笑哦,不过他们讲的是c++的boolean类型,我想的是java的,我当时就想boolean类型没有说占用多少个字节啊,在我影响中它就是true和false
废话不多说,看下文
这种概念性问题,最权威的就是查阅官网资料。Oracle官方已经在官网对基本数据类型,所占的字节数进行了说明,
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
但遗憾的是,官网唯独没有明确说明boolean类型占几个字节,原文如下:
boolean: The boolean data type has only two possible values:
true and false.
Use this data type for simple flags that track true/false conditions.
This data type represents one bit of information,
but its "size" isn't something that's precisely defined.
翻译过来,大致意思就是说:boolean类型的值有两个“真和假”。使用这个类型,可以用于简单的标记真/假的条件。这个类型可以表示一些信息,但它占用的字节大小并没有精确的定义。
接着下面
实际上,如果你接着google,这个问题还是会得到结论的。但也可以换个方式,看书。这个数据类型问题必然和java虚拟机有关,所以《Java虚拟机规范》一书中,其实也对这个问题进行过说明,以下是本书中相关的两个结论(不是原文,是对原文进行了提炼):
1.JVM没有提供booolean类型专用的字节码指令,而是使用int相关指令来代替。
2.对boolean数组的访问与修改,会共用byte数组的baload和bastore指令。
分析这两个结论,问题就解决了。
(1)上面的第1个结论是说:boolean在底层实际会调用int,那么既然int占4个字节,boolean也自然占4个字节。即,boolean类型占4个字节。
(2)上面的第2个结论是说:boolean数组在底层会用到byte指令,那么既然byte占1个字节,boolean数组中的boolean也就占1个字节。即,boolean数组中的boolean占1个字节。
综上两点,得出最终结论:在符合JVM规范的虚拟机中,
如果boolean是单独使用:boolean占4个字节。
如果boolean是以“boolean数组”的形式使用:boolean占1个字节。
提示:以上结论是《Java虚拟机规范》一书给的,也就是说,仅仅适用于那些遵循了“规范”的JVM。换句话说,如果某个JVM没有遵循规范,boolean到底几个字节就又无法得知了。
链接:https://mp.weixin.qq.com/s?src=11×tamp=1604890470&ver=2695&signature=i6WzS1SM598tEjjXq88xNu8TisOXhlPaDeyOz-YQ2-*qHOYneb7Qx2Xgne06PXRvXivjZnKR8nSZ8JcivmJ2hmHHk5UX6FGfYW1D5prjrmw2QS9Oj6FGeauR2J49xeZF&new=1
看完这个我是惊呆额我自己,我看来还是挺无知的。一开始我觉得搞笑,现在我笑不出来了。
革命尚未成功,同志仍需努力。