Java原语类型:int与Integer

时间:2011-06-24 22:59:17

标签: java android types

我很困惑何时在Java中使用原始与非原始(?)类型(即int与Integer)。我意识到在某些地方你不能使用原始类型(例如在使用generics时)。但是在“普通”代码中呢?使用非原始类型会有性能损失吗?使用Android时怎么样?

***我的问题非常类似于question,这是由以下海报之一发现的。相关问题的答案提供了对此问题的更多见解,这些问题未在下文中介绍。

***“非原始”类型被官方称为引用类型。

6 个答案:

答案 0 :(得分:20)

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

答案 1 :(得分:4)

非基本类型是对象。它们必须动态分配,垃圾收集并检查null-ness(尽管其中一些操作可能会被优化编译器删除)。读取它们的实际值需要从指针加载。原始类型是值。它们通常占用的空间更少,访问速度更快。

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

答案 2 :(得分:3)

在类型(autoboxing)之间进行转换会有轻微的损失。另外int的开销也会少一些,所以如果可以,我会一直使用int

另请参阅此问题:When to use primitive and when reference types in Java

答案 3 :(得分:2)

在Java中,int是原始数据类型,而Integer是Wrapper类。

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

您可以找到更详细的说明here

答案 4 :(得分:1)

作为一个OO纯粹主义者,你可能完全避开这些原语并且损害了性能成本和缺乏后缀运算符。 (是的,有性能成本。)您也可以简单地从作为设计者的可扩展性考虑中采用这种方法(不一定是纯粹的。)

作为一个实际问题(在理论和美学问题之外),尽可能使用基元,并使用不能使用基元的对象版本。 (您已经提到了一个这样的案例。语言和API将推动这一决定。)

作为一个表演怪胎,你可能会避开对象版本,如果你踩到一些OO黄金法则和神圣不苟的话,你可能不会太在意:表现为王,你做出相应的决定。

我建议选择2作为一个好的开始,直到你开发自己的教条偏好! :)

答案 5 :(得分:0)

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

就性能而言:编译器会在一定程度上优化您的代码,因此大部分时间都不是真正的问题。