Java 基本数据类型:int vs. Integer

19
我对在Java中何时使用原始类型和非原始类型(即int vs. Integer)感到困惑。我意识到在某些地方您不能使用原始类型(例如在使用generics时)。但是在“正常”代码中呢?使用非原始类型是否会有性能损失?在处理Android时呢?
***我的问题与此question非常相似,由下面的一个帖子发现。链接问题的答案提供了本问题未涵盖的其他见解。
***“非原始”类型被官方称为引用类型。

除了下面提到的差异之外,另一个不同之处是 null 不能分配给原始类型。 - tjb
另一个不同之处在于,对象可以转换为引用类型,例如Float,但不能转换为原始类型(float)。 - tjb
6个回答

22
简短回答:一个 int 是一个数字;一个 Integer 是一个指针,可以引用包含数字的对象。使用 Integer 进行算术运算需要更多的 CPU 周期和内存消耗。一个 int 不是一个对象,不能传递给任何需要对象的方法(就像你对泛型的说法一样)。

4
如果我没记错的话,int类型被分配在堆栈上,而Integer类型则被分配在堆上... - eggie5
2
我相信引用放在堆栈上,但实际的整数值本身放在堆上。 - cyngus

5

非基本类型是对象。它们需要动态分配内存、进行垃圾回收,并检查是否为空(尽管这些操作中的一些可能会被优化编译器移除)。读取它们的实际值需要从指针加载。基本类型是值。它们通常占用较少的空间,并且访问速度更快。

一个好的经验法则是,使用基本类型除非你需要多态性,在这种情况下,请使用相应的对象。


3

3

在Java中,int是原始数据类型,而Integer是一个包装类。

int作为原始数据类型具有较少的灵活性。我们只能在其中存储整数的二进制值。 由于Integerint数据类型的包装类,因此它在存储、转换和操作整数数据方面具有更多的灵活性。 Integer是一个类,因此可以调用在class中定义的各种内置方法。与任何其他引用(对象)类型一样,类型为Integer的变量存储对Integer对象的引用。

您可以在这里找到更详细的解释。


2
作为一个面向对象的纯粹主义者,你很可能会完全回避原始类型,不顾性能成本和缺乏后缀运算符。(是的,这会有性能成本。)你也可以出于设计上的可扩展性考虑采取这种方法(而不一定拘泥于纯洁性)。
作为一个实际问题(超出理论和审美问题),尽可能在任何地方使用原始类型,并在无法使用原始类型时使用对象版本。(你已经提到了其中一个情况。语言和API将推动这个决定。)
作为一个性能狂人,你很可能会回避对象版本,如果你违反了一些OO的黄金规则和神圣的禁忌,你可能并不太关心:性能至上,你会相应地做出决策。
我建议从选项2开始作为一个好的起点,直到你发展出自己的教条偏好! :)

似乎创建JVM的人允许运算符重载,只是我们不能使用。对于整数,我们可以使用运算符。 - Nicholas

0

我的观点是:使用整数作为参数或返回值允许一件原始 int 不允许的事情:使用 null。但这是一个好主意吗?我认为很少是。

就性能而言:编译器会对您的代码进行一定程度的优化,因此大多数情况下这不是真正的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接