为什么 Java API 使用 int
,而 short
甚至 byte
就足够了?
示例:DAY_OF_WEEK
类中的字段 Calendar
使用 int
。
如果差异太小,那为什么还存在这些数据类型(short
、int
)?
最佳答案
已经指出了一些原因。例如,"...(Almost) All operations on byte, short will promote these primitives to int" .然而,下一个明显的问题是:为什么这些类型被提升为 int
?
所以更深入一点:答案可能只是与 Java 虚拟机指令集有关。正如 Table in the Java Virtual Machine Specification 中总结的那样, all 积分算术运算,如加法、除法等,仅适用于 int
类型和 long
类型,以及 不较小的类型。
(顺便说一句:较小的类型(byte
和 short
)基本上只适用于 数组。一个 像 new byte[1000]
这样的数组 将占用 1000 个字节,像 new int[1000]
这样的数组将占用 4000 个字节)
当然,现在可以说 "...下一个明显的问题是:为什么这些指令只提供给 int
(以及长
)?”。
上面提到的JVM Spec中提到了一个原因:
If each typed instruction supported all of the Java Virtual Machine's run-time data types, there would be more instructions than could be represented in a byte
此外,Java 虚拟机可以被视为真实处理器的抽象。并介绍专用Arithmetic Logic Unit对于较小的类型不值得付出努力:它需要额外的晶体管,但它仍然只能在一个时钟周期内执行一次加法。设计 JVM 时的主要架构是 32 位,正好适合 32 位 int
。 (涉及 64 位 long
值的操作作为特例实现)。
(注意:考虑到可能的矢量化等,最后一段有点过于简单了,但应该给出基本概念,而不需要深入探讨处理器设计主题)
编辑:一个简短的附录,重点关注问题中的示例,但在更一般的意义上:人们也可以询问使用较小的类型存储 fields 是否有益。例如,有人可能认为可以通过将 Calendar.DAY_OF_WEEK
存储为 byte
来节省内存。但在这里,Java 类文件格式开始发挥作用:所有 Fields in a Class File占用至少一个“槽”,其大小为一个 int
(32 位)。 (“宽”字段 double
和 long
占用两个插槽)。因此,将字段显式声明为 short
或 byte
也不会节省任何内存。
关于optimization - 为什么 Java API 使用 int 而不是 short 或 byte?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27122610/