其中一些原因已经指出。例如,事实是“...(几乎)所有对 byte、short 的操作都会将这些原语提升为 int”。然而,显而易见的下一个问题是:WHY这些类型是否被提升为int
?
更深入一点:答案可能仅仅与 Java 虚拟机指令集有关。正如总结中Java虚拟机规范中的表, all积分算术运算,如加法、除法等,仅适用于类型int
和类型long
, and not对于较小的类型。
(An aside: The smaller types (byte
and short
) are basically only intended for arrays. An array like new byte[1000]
will take 1000 bytes, and an array like new int[1000]
will take 4000 bytes)
当然,现在人们可以说“......显而易见的下一个问题是:WHY这些说明仅适用于int
(and long
)?".
上面提到的 JVM Spec 中提到了一个原因:
如果每个类型化指令都支持 Java 虚拟机的所有运行时数据类型,则指令数量将多于一个字节所能表示的数量
此外,Java 虚拟机可以被视为真实处理器的抽象。并推出专用算术逻辑单元对于较小的类型,不值得付出努力:它需要额外的晶体管,但它仍然只能在一个时钟周期内执行一次加法。 JVM设计时的主导架构是32位,正好适合32位int
。 (涉及64位的操作long
值作为特殊情况实现)。
(Note: The last paragraph is a bit oversimplified, considering possible vectorization etc., but should give the basic idea without diving too deep into processor design topics)
编辑:一个简短的附录,重点关注问题中的示例,但从更一般的意义上来说:人们还可以问存储是否没有好处fields使用较小的类型。例如,人们可能认为可以通过存储来节省内存Calendar.DAY_OF_WEEK
as a byte
。但在这里,Java 类文件格式发挥了作用:所有类文件中的字段至少占据一个“槽”,其大小为 1int
(32 位)。 (“宽”领域,double
and long
,占用两个槽)。因此明确声明一个字段为short
or byte
也不会节省任何内存。