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 位 int
或 Integer
,除非您知道自己将具有超过 20 亿的值,在这种情况下使用 long
或 Long
。在现代传统硬件上,几乎没有理由为使用 short
/Short
而烦恼。
特殊情况
但是既然你问“在选择的时候还有什么要考虑的”,这里有三种特殊情况:强制限制、移植 C 代码和替代硬件。
强制限制
如果您想强制执行 short
或 Short
的限制,请使用这些类型。当您知道您应该只拥有小于大约 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 是没有意义的。如果外部代码(不是我自己的)正在使用原语,我会在该上下文中使用原语。
在 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 位 int
或 Integer
,除非您知道自己将具有超过 20 亿的值,在这种情况下使用 long
或 Long
。在现代传统硬件上,几乎没有理由为使用 short
/Short
而烦恼。
特殊情况
但是既然你问“在选择的时候还有什么要考虑的”,这里有三种特殊情况:强制限制、移植 C 代码和替代硬件。
强制限制
如果您想强制执行 short
或 Short
的限制,请使用这些类型。当您知道您应该只拥有小于大约 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 是没有意义的。如果外部代码(不是我自己的)正在使用原语,我会在该上下文中使用原语。