Java 64 位 - 整数与短整数

Java 64bits - Integer vs Short

在 64 位 JVM 中使用 short 而不是 int 有什么充分的理由吗?

我的意思是,两者都需要分配 32 位内存。

本主题展示了整数如何可以更快地进行运算,例如乘法: [In java, is it more efficient to use byte or short instead of int and float instead of double?

我也知道原语数组更适合节省分配的内存。

除此之外,在选择这两种类型的时候还有什么需要考虑的吗?

tl;博士

除非你有很特别的use-case,就用:

  • Integer为业务object取值,成员变量就class。
  • int 用于大量原始数据。

只需使用Integer

对于最常见的 business-oriented Java 应用程序,通常的做法是只使用 32 位 intInteger,除非您知道自己将具有超过 20 亿的值,在这种情况下使用 longLong。在现代传统硬件上,几乎没有理由为使用 short/Short 而烦恼。

特殊情况

但是既然你问“在选择的时候还有什么要考虑的”,这里有三种特殊情况:强制限制、移植 C 代码和替代硬件。

强制限制

如果您想强制执行 shortShort 的限制,请使用这些类型。当您知道您应该只拥有小于大约 32,000 的值,并且希望编译器或 运行time JVM 强制执行该值时,请选择这些。

例如101加一:

short oneOhOnePlusOne = ( (short) 101 + (short) 1 ) ;
System.out.println( "oneOhOnePlusOne: " + oneOhOnePlusOne ) ;

102

接下来,尝试超过限制以查看编译器强制执行限制。

short shortMaxPlusOne = ( Short.MAX_VALUE + (short) 1 ) ;
System.out.println( "shortMaxPlusOne: " + shortMaxPlusOne ) ;

error: incompatible types: possible lossy conversion from int to short

看到这个code run live at IdeOne.com

移植 C 代码

这些不同的数字类型很可能被放入 Java 以便更容易移植 C 代码,无论是在实践上还是在心理上。 Java 的发明者很清楚,在那个时代,大多数新编程语言的尝试都以“不像 C”的批评而告终。因此 Objective-C (an inspiration for Java), and thus the monstrosity that is C++

因此,确实,如果您正在 移植 C 代码,请使用匹配类型来复制行为。

顺便说一下……从技术上讲,C 而不是 实际上定义了它的数字类型的大小。实际上,几乎每个 C 实现都使用 Java.

中所示的大小

仅供参考,即使是 Swift and Kotlin 等最现代的语言也有 built-in 8、16、32 和 64 位整数的数字类型。

更多限制性硬件

如果您的应用有可能 运行 在不基于 x86-64 的其他硬件上运行,那么您可能希望使用这些类型。 Java 此类硬件的替代实现可能会针对较小的类型进行更好的优化。

原始与Object

Array of primitives are preferable for saving memory allocated

首先,不要为此紧张。不要落入 premature optimization 的陷阱。在具有最常见应用程序的传统硬件上,使用基元与 objects 和数组与 collections 相比,任何内存节省都是微不足道的。使用适合您的编码上下文的类型 (primitive/object) 和结构 (array/collection)。

我的做法:

  • 在我的代码中,objects。
    在我自己的 class是的。我有两个原因。首先,我是 Object 粉丝的阵营之一,他们希望 Java 是没有任何原语的纯 OOP。 (事实上​​ ,正在进行研究以查看基元是否可以在 Java 的 far-future 版本中实际上消失。)其次,我发现当我使用基元时,我最终需要在要求的上下文中使用它objects,例如 collections。
  • 对于其他人的代码,如果他们这样做,就使用基元。
    在我自己的 class 之外,我不强求这个问题,因为不适当的 auto-boxing 是没有意义的。如果外部代码(不是我自己的)正在使用原语,我会在该上下文中使用原语。