为何Java里的boolean值类型大小会是int,boolean数组值类型是byte?

一、Java类型的八大基本数据类型

原始数据类型(Java™ 教程> 学习Java语言>语言基础) (oracle.com)

  • byte:(整数型:1字节)数据类型为 8 位有符号二进制的补码整数。它的最小值为 -128,最大值为 127(含)。数据类型对于节省大型数组中的内存非常有用,其中内存节省实际上很重要。它们也可以用来代替它们的限制有助于澄清你的代码的地方;变量的范围有限这一事实可以作为一种文档形式。bytebyteint

  • short:(整数型:2字节)数据类型是 16 位有符号二进制的补码整数。它的最小值为 -32768,最大值为 32767(含)。与 一样,相同的准则适用:在内存节省实际上很重要的情况下,您可以使用 来节省大型数组中的内存。shortbyteshort

  • int:(整数型:4字节)默认情况下,数据类型为 32 位有符号二进制补码整数,最小值为 -2^31,最大值为 (2^31)-1。在 Java SE 8 及更高版本中,可以使用数据类型来表示无符号的 32 位整数,该整数的最小值为 0,最大值为 232-1。使用 Integer 类将数据类型用作无符号整数。有关详细信息,请参阅数字类部分。静态方法(如 等)已添加到 Integer 类中,以支持无符号整数的算术运算。intintintcompareUnsigneddivideUnsigned

  • long:(整数型:8字节)数据类型为 64 位二进制补码整数。带符号长整型的最小值为 -2^63,最大值为 (2^63)-1。在 Java SE 8 及更高版本中,可以使用数据类型来表示无符号的 64 位长整型,该长整型的最小值为 0,最大值为 (2^64)-1。如果需要的值范围比提供的值范围更宽,请使用此数据类型。Long 类还包含诸如 等方法,以支持无符号 long 的算术运算。longlongintcompareUnsigneddivideUnsigned

  • float:(浮点型:4字节)数据类型为单精度 32 位 IEEE 754 浮点数。其值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。与 和 的建议一样,如果需要在浮点数的大型数组中节省内存,请使用 (而不是 )。此数据类型绝不应用于精确值,例如货币。为此,您需要改用java.math.BigDecimal 类。数字和字符串涵盖Java平台提供的其他有用类。floatbyteshortfloatdoubleBigDecimal

  • double:(浮点型:8字节)数据类型为双精度 64 位 IEEE 754 浮点数。其值范围超出了本讨论的范围,但在 Java 语言规范的浮点类型、格式和值部分中指定。对于十进制值,此数据类型通常是默认选项。如上所述,此数据类型绝不应用于精确值,例如货币。double

  • 布尔值:(布尔型)数据类型只有两个可能的值:True和False 。将此数据类型用于跟踪真/假条件的简单标志。此数据类型表示一位信息,但其“大小”不是精确定义的。booleantruefalse

  • char:(字符型:2字节)数据类型是单个 16 位 Unicode 字符。它的最小值为 (或 0),最大值为 (或 65,535(含 65,535)。char'\u0000''\uffff'


二、如上所示,boolean的值类型是没有定义的大小的,那么它是如何在计算机里进行存储(如编译为字节码文件)表示的呢?

        实际上,这个数据类型问题和java虚拟机有关。在《Java虚拟机规范》一书中,其实也对这个问题进行过说明:

        1.JVM没有提供booolean类型专用的字节码指令,而是使用int相关指令来代替(即编译为字节码文件时boolean的值类型大小是4字节)。

        2.对boolean数组的访问与修改,会共用byte数组的baload和bastore指令(即编译为字节码文件时boolean数组的值类型大小是1字节)。--->此处前提是在Oralce的JVM中,在非Oralce的JVM中,其值类型大小还有待考证


三、为什么boolean的值类型在编译为字节码文件时要转化为int类型呢,用byte或short类型不是更节省内存空间吗

        经过查阅资料发现,使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),32 位 CPU 使用 4 个字节是最为节省的,哪怕你是 1 个 bit 他也是占用 4 个字节。因为 CPU 寻址系统只能 32 位 32 位地寻址,具有高效存取的特点。


四、究其根本,还是得看虚拟机的实现。

        在java规范中,并没有明确指定其大小,因此即使在《Java虚拟机规范》给出了boolean为4个字节和boolean数组1个字节的定义,具体还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

希仔~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值