Java:整数等于==

时间:2010-09-03 17:03:40

标签: java integer wrapper primitive equals-operator

从Java 1.5开始,在很多情况下,您可以将Integerint进行交换。

然而,我发现我的代码中存在一个潜在的缺陷让我感到有些惊讶。

以下代码:

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
    mismatch = true;
当值相等时,

似乎错误地设置了不匹配,尽管我无法确定在什么情况下。我在Eclipse中设置了一个断点,看到Integer值都是137,我检查了布尔表达式并且它说它是假的,但当我跨过它时,它将不匹配设置为true。

将条件更改为:

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))

修复了问题。

有人能说清楚为什么会这样吗?到目前为止,我只在自己的PC上看到了我的localhost上的行为。在这种特殊情况下,代码成功通过了大约20次比较,但在2次失败。问题始终可以重现。

如果这是一个普遍的问题,它应该导致我们的其他环境(开发和测试)出错,但到目前为止,没有人在执行此代码片段的数百次测试后报告此问题。

使用==比较两个Integer值是否仍然不合法?

除了下面的所有优秀答案之外,以下stackoverflow链接还有相当多的附加信息。它实际上会回答我原来的问题,但因为我没有在我的问题中提到自动装箱,所以它没有出现在选定的建议中:

Why can't the compiler/JVM just make autoboxing “just work”?

7 个答案:

答案 0 :(得分:212)

JVM正在缓存Integer值。 ==仅适用于-128到127之间的数字 http://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching

答案 1 :(得分:69)

您无法将两个Integer与简单==对象进行比较,因此大部分时间参考都不会相同。

有一个技巧,{ - 1}}介于-128和127之间,引用与自动装箱使用Integer相同,后者会缓存小整数。

  

如果被装箱的值p为真,假,一个字节,范围为\ u0000到\ u007f的字符,或者介于-128和127之间的整数或短数,则让r1和r2为任意结果p的两次拳击转换。始终是r1 == r2。

的情况

资源:

关于同一主题:

答案 2 :(得分:5)

问题是你的两个Integer对象就是那个对象。它们不匹配,因为您正在比较两个对象引用,而不是其中的值。显然,.equals被覆盖以提供值比较,而不是对象引用比较。

答案 3 :(得分:4)

Integer指的是引用,也就是说,当比较你正在比较的引用时,如果它们指向同一个对象,而不是值。因此,你看到的问题。它使用普通int类型工作得很好的原因是它会取消Integer包含的值。

我可以补充一点,如果你正在做你正在做的事情,为什么要开始if陈述?

mismatch = ( cdiCt != null && cdsCt != null && !cdiCt.equals( cdsCt ) );

答案 4 :(得分:3)

“==”始终比较值的内存位置或对象引用。 equals方法总是比较值。但是equals也间接使用“==”运算符来比较值。

Integer使用Integer缓存来存储-128到+127之间的值。如果使用==运算符检查-128到127之间的任何值,则返回true。除了这些值之外,它返回false。

请参阅 link 以获取更多信息

答案 5 :(得分:1)

除了这些很好的答案外,我了解到的是:

从不将对象与==进行比较,除非您打算对它们进行比较 通过他们的引用。

答案 6 :(得分:1)

为了确保使用==的正确性,您还可以在进行Integer比较之前先将比较的==值之一开箱,例如:

if ( firstInteger.intValue() == secondInteger ) {..

第二个将自动取消装箱(当然,您必须先检查null)。