为什么Java API使用int而不是short或byte?

威利·曼策尔(Willi Mentzel):

为什么Java API使用int,何时short甚至byte足够使用?

示例:DAY_OF_WEEK类中字段Calendar使用int

如果差异太小,那为什么这些数据类型(shortint根本存在呢?

Marco13:

已经指出了一些原因。例如,“ ...(几乎)对byte,short的所有操作将把这些原语提升为int”的事实但是,下一个显而易见的问题是:为什么将这些类型提升为int

因此,要更深入一点:答案可能只是与Java虚拟机指令集有关。Java虚拟机规范表中所概述所有积分算术运算(例如加法,除法和其他运算)仅适用于type int和type long而不适用于较小的类型。

(顺便说一句,较小的类型(byteshort)基本仅用于数组。like这样数组new byte[1000]将占用1000个字节,而like这样的数组new int[1000]将占用4000个字节)

现在,当然可以说:“ ...下一个明显的问题是:为什么这些说明仅用于int(和long)?”

上面提到的JVM Spec中提到了一个原因:

如果每个类型的指令都支持Java虚拟机的所有运行时数据类型,那么指令的数量将超过一个字节表示的数量。

另外,可以将Java虚拟机视为真实处理器的抽象。为较小的型号引入专用的算术逻辑单元将是不值得的:它需要额外的晶体管,但仍然只能在一个时钟周期内执行一次加法运算设计JVM时,主要的体系结构是32位,正好是32位intlong作为特殊情况,将实现涉及64位的操作)。

(注意:考虑到可能的向量化等,最后一段有些过分简化,但应该给出基本思想,而不必深入探讨处理器设计主题)


编辑:简短的附录,重点放在问题的示例上,但从更一般的意义上讲:还可以问一下使用较小类型存储字段是否有益例如,人们可能认为可以通过将其存储Calendar.DAY_OF_WEEK来节省内存byte但是在这里,Java类文件格式开始起作用:类文件中的所有字段至少占据一个“槽”,其大小为1 int(32位)。(“宽”字段double和和long占据两个位置)。因此,显式声明一个字段为shortor byte不会保存任何内存。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么Java的使用int i = 1 << 4,不是int i = 16?

为什么默认为“ int”而不是“ byte”?

为什么Java 14不是LTS?

为什么EnumMap不是Java中的SortedMap?

为什么'(int)(char)(byte)-2'在Java中产生65534?

Android为什么要使用Java?

为什么不是(123 == 0123)在Java中?

在Java中,使用byte或short代替int和float代替double效率更高吗?

为什么在Java EE中使用CDI

为什么在Java中首选使用列表而不是数组?

为什么使用Java批注?

为什么+在Java中使用Strings?

为什么在Java中使用堆内存

为什么Java枚举不是可克隆的?

为什么在Java中使用HashMap失败?

为什么在Java中使用ByteArrayInputStream而不是byte []

为什么Java语言环境不是常量?

为什么Java字段不是多态的?

Java:为什么使用方法而不是构造函数?

为什么我应该使用Kotlin而不是Java?

为什么在使用CHAR类型的参数调用时构造函数选择INT类型而不是SHORT?

为什么使用unsigned short比使用int慢?

如果byte + byte = int为什么int + int不是short / long?在C#中

为什么Java对lambda函数使用->而不是=>?

为什么Java使用void?

为什么我们应该使用 OutputStream.write(byte[] b, int off, int len) 而不是 OutputStream.write(byte[] b)?

为什么在 Java 中不使用实例对象而不是 ThreadLocal?

为什么纳秒必须在java中使用int而不是long

为什么在 Java 中使用 int 而不是 Integer 时会出现无限循环?