Java基本数据类型boolean占用几个字节?

文章详细阐述了Java中基本数据类型在JVM编译过程中的字节码表示,特别指出boolean虽然占用1个字节,但在操作boolean数组时,由于CPU处理数据的限制,JVM使用int类型进行字节码操作。这解释了为何在boolean单独使用时被视为int类型,以及背后的空间效率考虑。
摘要由CSDN通过智能技术生成

前言

我们知道Java中的基本数据类型有以下几种
char占用2个字节
boolean占用1个字节或者4个字节(稍后解释)
byte占用1个字节
short占用2个字节
int占用4个字节
long占用8个字节
float占用4个字节
double占用8个字节

char a = 'a';
boolean b = false;
int c = 1;
......

示例

当我们在对这些基本数据类型操作时,JVM会帮我们生成字节码指令,举个例子

public class BasicDataType {

    public static void main(String[] args) {
        int a = 1;
        int b = 2;
        int c = a + b;
    }
}

观察class编译文件

我们使用javac BasicDataType.java命令编译生成class,然后我们再通过javap -v BasicDataTyple.class命令来查看下生成的字节码,重点观察红色方框中的内容
在这里插入图片描述
接着我再来简单介绍iconst iadd
iconst
表示我们定义了一个int类型的常量,其中i表示int类型,
iadd
表示两个int类型变量进行相加

同理其他的基本类型也有相应的指令,具体对应关系如下

  • l 代表long
  • s代表short
  • b代表byte
  • c代表char
  • f代表float
  • d代表double

疑问

  • 看到这里,你可能会有疑问? 为什么没有boolean类型?当时我也有这样的疑问,会不会是资料写错了,抱着怀疑的态度去思考问题,我们再来将代码做一些调整再来观察
public class BasicDataType {

    public static void main(String[] args) {

        boolean testBool = false;

        boolean[] testBoolArray = new boolean[10];
        testBoolArray[0] = true;
    }
}

javac BasicDataType.java
javap -v BasicDataType.class

重点关注下这个部分
在这里插入图片描述

  • 看到这里你可能会大吃一惊,iconst 不是操作int类型的嘛,我明明操作的是boolean类型,怎么是int类型的字节码操作。
    通过查询官方字节码指令集:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5.bastore
    The arrayref must be of type reference and must refer to an array whose components are of type byte or of type boolean. The index and the value must both be of type int. The arrayref, index, and value are popped from the operand stack. The int value is truncated to a byte and stored as the component of the array indexed by index.

  • 官方是这样描述boolean类型数组的,翻译过来的意思就是在操作boolean数组类型的时候,它的index索引值以及存储的值(也就是数组中的元素)都必须是int类型,对于boolean数组来说,会对int类型做截断让其占用1个字节的存储空间

  • 总结来说就是,使用boolean数组类型,它的占用空间是一个字节,当我们单独使用boolean类型的时候,它其实被当作int类型了,那么也就是4个字节

为什么这样处理?

  • 结论我们已经知道了,接下来我们来谈谈为什么要这样处理?JVM为什么要使用int类型来表示boolean类型的字节码操作,为什么不用byte或者short,这样还可以在空间上节省一些
使用int类型的原因:
对于当下32位的处理器来说,
一次处理数据是32(这里不是指的是32/64位操作系统),而是CPU硬件层面)的高效存取的数据,
虽然定义了boolean类型,
但是JVM只对它提工了非常有限的支持,
JVM中没有任何供boolean专用的字节码指令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coffee_babe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值