我很困惑何时在Java中使用原始与非原始(?)类型(即int与Integer)。我意识到在某些地方你不能使用原始类型(例如在使用generics时)。但是在“普通”代码中呢?使用非原始类型会有性能损失吗?使用Android时怎么样?
***我的问题非常类似于question,这是由以下海报之一发现的。相关问题的答案提供了对此问题的更多见解,这些问题未在下文中介绍。
***“非原始”类型被官方称为引用类型。
答案 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
作为原始数据类型具有较小的灵活性。我们只能在其中存储整数的二进制值。
由于Integer
是int
数据类型的包装类,因此它在存储,转换和处理整数数据方面为我们提供了更大的灵活性。
Integer
是一个类,因此它可以调用class
中定义的各种内置方法。类型Integer
的变量存储对Integer
对象的引用,就像存储任何其他引用(对象)类型一样。
您可以找到更详细的说明here。
答案 4 :(得分:1)
作为一个OO纯粹主义者,你可能完全避开这些原语并且损害了性能成本和缺乏后缀运算符。 (是的,有性能成本。)您也可以简单地从作为设计者的可扩展性考虑中采用这种方法(不一定是纯粹的。)
作为一个实际问题(在理论和美学问题之外),尽可能使用基元,并使用不能使用基元的对象版本。 (您已经提到了一个这样的案例。语言和API将推动这一决定。)
作为一个表演怪胎,你可能会避开对象版本,如果你踩到一些OO黄金法则和神圣不苟的话,你可能不会太在意:表现为王,你做出相应的决定。
我建议选择2作为一个好的开始,直到你开发自己的教条偏好! :)
答案 5 :(得分:0)
我的观点:使用Integer作为参数或返回值允许原始int不允许的一件事:使用null
。但这是个好主意吗?我认为它很少有。
就性能而言:编译器会在一定程度上优化您的代码,因此大部分时间都不是真正的问题。