为什么Java API使用int
,何时short
甚至byte
足够使用?
示例:DAY_OF_WEEK
类中的字段Calendar
使用int
。
如果差异太小,那为什么这些数据类型(short
,int
)根本存在呢?
已经指出了一些原因。例如,“ ...(几乎)对byte,short的所有操作将把这些原语提升为int”的事实。但是,下一个显而易见的问题是:为什么将这些类型提升为int
?
因此,要更深入一点:答案可能只是与Java虚拟机指令集有关。如Java虚拟机规范的表中所概述,所有积分算术运算(例如加法,除法和其他运算)仅适用于type int
和type long
,而不适用于较小的类型。
(顺便说一句,较小的类型(byte
和short
)基本仅用于数组。like这样的数组new byte[1000]
将占用1000个字节,而like这样的数组new int[1000]
将占用4000个字节)
现在,当然可以说:“ ...下一个明显的问题是:为什么这些说明仅用于int
(和long
)?” 。
上面提到的JVM Spec中提到了一个原因:
如果每个类型的指令都支持Java虚拟机的所有运行时数据类型,那么指令的数量将超过一个字节表示的数量。
另外,可以将Java虚拟机视为真实处理器的抽象。为较小的型号引入专用的算术逻辑单元将是不值得的:它需要额外的晶体管,但仍然只能在一个时钟周期内执行一次加法运算。设计JVM时,主要的体系结构是32位,正好是32位int
。(long
作为特殊情况,将实现涉及64位值的操作)。
(注意:考虑到可能的向量化等,最后一段有些过分简化,但应该给出基本思想,而不必深入探讨处理器设计主题)
编辑:简短的附录,重点放在问题的示例上,但从更一般的意义上讲:还可以问一下使用较小类型存储字段是否有益。例如,人们可能认为可以通过将其存储Calendar.DAY_OF_WEEK
为来节省内存byte
。但是在这里,Java类文件格式开始起作用:类文件中的所有字段至少占据一个“槽”,其大小为1 int
(32位)。(“宽”字段double
和和long
占据两个位置)。因此,显式声明一个字段为short
or byte
不会保存任何内存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句