我遇到一个使用整数变量来捕获在for循环中使用的大小的类。这是一个好的做法,还是应该使用int原始数据类型?
Integer size = something.getFields().size();
for (Integer j = 0; j < size - 1; ++j)
我遇到一个使用整数变量来捕获在for循环中使用的大小的类。这是一个好的做法,还是应该使用int原始数据类型?
Integer size = something.getFields().size();
for (Integer j = 0; j < size - 1; ++j)
提供Integer类是为了以纯OO方式装箱/拆箱值。在适当的情况下使用int,除非您需要以OO方式使用它;这种情况下,可以使用Integer。
然而,在这里发生了非常不同的事情。int是一个数字;Integer是一个指针,可以引用包含数字的对象。
...
int不是对象,并且不能传递给需要对象的任何方法。通常的情况是使用提供的集合类(List、Map、Set) - 虽然有可能编写这些类的版本以提供与对象版本相似的功能。每当使用内省(例如在反射API中)时,都经常需要包装器类(Integer、Double等)。
何时使用其中之一的更好描述:
选择int还是Integer
我将从如何使用这些类型开始,然后详细介绍为什么。
- 出于性能原因,请首选
int
- 接受对象的方法(包括泛型类型,如
List<T>
)将隐式要求使用Integer
- 对于低值(-128至
- 由于内部化-请使用
Integer.valueOf(int)
而不是new Integer(int)
- 不要使用Integer类型的
==
或!=
- 在需要表示值的缺失(null)时,请考虑使用
Integer
- 注意将Integer值取消装箱为带有null值的int
int
,就使用它。如果该值可能为null
或被用作对象(例如泛型),请使用Integer
。int
通常执行略微更好。Integer#intValue(Integer)
和Integer#valueOf(int)
来回进行转换是非常简单的。 - ametrenInteger.intValue()
;) 随着 Java 5.0 引入自动装箱和拆箱功能,您无需这么做。 - Peter Lawreyint
的性能表现不仅是稍微好一些,而是要好很多,特别是在紧密循环中 :) - Sergey Kalinichenko实际应用中,这种方法并不好,尽可能使用int
。使用Integer
表示该特定变量可以为null
(或者它在集合内,泛型问题啊...) - 这并非事实。
此外,使用Integer
会引入额外的装箱和拆箱开销。
在大型项目中,这是一个潜在的灾难等待发生。这位程序员忘记了每个整数实际上都是一个新对象,并且为了将其用作int,必须始终进行装箱和拆箱操作。这不仅效率低下,而且也无法按预期运行。建议您尽可能始终使用int,只有在将这些值放入列表、容器或数据库存储时才使用Integer。请记住,使用>、<和==比较对象与使用相同的运算符比较基元时意义不同。
当比较整数类型时,不能使用==或!=,因为它将比较它们的“指针位置”。
为了启动自动解包,至少其中一个元素必须是int。
如果您正在比较Integer1 == Integer2,则实际发生的是调用Object.equals,如:Integer1.equals(Integer2),它(除非被覆盖)比较引用。
(这是对@Muhammad Shahab的回复,但我还不能添加评论)
尽可能在适当的地方使用原始类型。
原始类型不能用作GenericArgument或null。
不要只是为了循环而使用它。使用原始类型int(性能更好),它与类Integer不同。
Integer类将原始类型int的值包装在对象中。类型为Integer的对象包含一个类型为int的单个字段。
此外,该类提供了几种方法,用于将int转换为String和String转换为int,以及其他在处理int时有用的常量和方法。
因此,如果需要调用Integer函数或需要将null值分配给它,则应使用Integer。
对于像List这样的泛型,您还需要使用Integer而不是int。
由于装箱和拆箱会产生将原始类型和引用类型之间进行转换的开销,因此可能会导致性能下降。
然而,Integer类添加了一些非常有用的附加方法。
当需要使用对象时,您必须使用包装类,例如Integer、Double、Float等...
例如:
int n = Integer.parseInt("10");
在这里,我们将字符串转换为整数(原始类型), 但是parseInt(String str)方法仅适用于包装类(即对象), 因此我们使用它...您将在Java中找到更多的用法。
我通常使用Integer,因为它是纯面向对象的。int的性能绝对比其对象对应物要好得多,但只有在循环数百万次时才会有明显的差别。
在我看来,如果性能在您的应用程序中至关重要,并且您想挤出甚至一纳秒的时间,那么请毫不犹豫地使用int。但如果面向对象和可读性是主要关注点,则请使用Integer。