使用int还是Integer?

70

我遇到一个使用整数变量来捕获在for循环中使用的大小的类。这是一个好的做法,还是应该使用int原始数据类型?

Integer size = something.getFields().size();
for (Integer j = 0; j < size - 1; ++j) 

4
可能重复:**int或Integer**可能存在重复:**int或Integer** - Siva Charan
提供了Integer类,以便可以以纯面向对象的方式装箱/拆箱值。除非您需要以面向对象的方式使用它,否则请在适当的情况下使用int;在这种情况下,使用Integer是合适的。 - Mike McMahon
可能是[int或Integer]的重复问题:(https://dev59.com/ZnRC5IYBdhLWcg3wD8xV) - Tomasz Nurkiewicz
10个回答

103

提供Integer类是为了以纯OO方式装箱/拆箱值。在适当的情况下使用int,除非您需要以OO方式使用它;这种情况下,可以使用Integer。

Java Int vs Integer

然而,在这里发生了非常不同的事情。int是一个数字;Integer是一个指针,可以引用包含数字的对象。

...

int不是对象,并且不能传递给需要对象的任何方法。通常的情况是使用提供的集合类(List、Map、Set) - 虽然有可能编写这些类的版本以提供与对象版本相似的功能。每当使用内省(例如在反射API中)时,都经常需要包装器类(Integer、Double等)。

何时使用其中之一的更好描述:

选择int还是Integer

我将从如何使用这些类型开始,然后详细介绍为什么。

  • 出于性能原因,请首选int
  • 接受对象的方法(包括泛型类型,如List<T>)将隐式要求使用Integer
  • 对于低值(-128至
  1. 由于内部化-请使用Integer.valueOf(int)而不是new Integer(int)
  • 不要使用Integer类型的==!=
  • 在需要表示值的缺失(null)时,请考虑使用Integer
  • 注意将Integer值取消装箱为带有null值的int

3
你的回答非常好。请注意,在移动设备或资源受限的应用程序中使用原始值会带来性能上的优势。 - Andrew Carr
1
一个int不是一个对象,不能传递给任何需要对象的方法。那么doSomething(911)怎么样?public Object doSomething(Object o) { // 做一些事情!!! return o; } - Simple-Solution
为什么不在整数类型中使用 == 或 !=?它不会自动拆箱为int吗? - Muhammad Shahab
@MuhammadShahab 使用 == 或 != 来比较的是引用而非整数值。这个 https://dev59.com/12435IYBdhLWcg3wrSFB#5279515 是一个很好的回答,解释了整数的相等性。 - 赣西狠人

43
如果可以使用int,就使用它。如果该值可能为null或被用作对象(例如泛型),请使用Integer
通常情况下,使用哪个都无所谓,但是int通常执行略微更好。

同时,使用Integer#intValue(Integer)Integer#valueOf(int)来回进行转换是非常简单的。 - ametren
我想你的意思是 Integer.intValue() ;) 随着 Java 5.0 引入自动装箱和拆箱功能,您无需这么做。 - Peter Lawrey
7
在许多情况下,int 的性能表现不仅是稍微好一些,而是要好很多,特别是在紧密循环中 :) - Sergey Kalinichenko

18

实际应用中,这种方法并不好,尽可能使用int。使用Integer表示该特定变量可以为null(或者它在集合内,泛型问题啊...) - 这并非事实。

此外,使用Integer会引入额外的装箱和拆箱开销。


5

在大型项目中,这是一个潜在的灾难等待发生。这位程序员忘记了每个整数实际上都是一个新对象,并且为了将其用作int,必须始终进行装箱和拆箱操作。这不仅效率低下,而且也无法按预期运行。建议您尽可能始终使用int,只有在将这些值放入列表、容器或数据库存储时才使用Integer。请记住,使用>、<和==比较对象与使用相同的运算符比较基元时意义不同。


1

当比较整数类型时,不能使用==或!=,因为它将比较它们的“指针位置”。

为了启动自动解包,至少其中一个元素必须是int。

如果您正在比较Integer1 == Integer2,则实际发生的是调用Object.equals,如:Integer1.equals(Integer2),它(除非被覆盖)比较引用。

(这是对@Muhammad Shahab的回复,但我还不能添加评论)


1

尽可能在适当的地方使用原始类型。

原始类型不能用作GenericArgument或null。


1

不要只是为了循环而使用它。使用原始类型int(性能更好),它与类Integer不同。

Integer类将原始类型int的值包装在对象中。类型为Integer的对象包含一个类型为int的单个字段。

此外,该类提供了几种方法,用于将int转换为String和String转换为int,以及其他在处理int时有用的常量和方法。

因此,如果需要调用Integer函数或需要将null值分配给它,则应使用Integer。

对于像List这样的泛型,您还需要使用Integer而不是int。


1

由于装箱和拆箱会产生将原始类型和引用类型之间进行转换的开销,因此可能会导致性能下降。

然而,Integer类添加了一些非常有用的附加方法。


1

当需要使用对象时,您必须使用包装类,例如Integer、Double、Float等...

例如:

 int n = Integer.parseInt("10");

在这里,我们将字符串转换为整数(原始类型), 但是parseInt(String str)方法仅适用于包装类(即对象), 因此我们使用它...您将在Java中找到更多的用法。


新手问题:这不等同于 int n = Integer.parseInt("10").intValue; 吗? - Sam Sirry

0

我通常使用Integer,因为它是纯面向对象的。int的性能绝对比其对象对应物要好得多,但只有在循环数百万次时才会有明显的差别。

在我看来,如果性能在您的应用程序中至关重要,并且您想挤出甚至一纳秒的时间,那么请毫不犹豫地使用int。但如果面向对象和可读性是主要关注点,则请使用Integer。


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