为什么Java没有看到整数是平等的?

时间:2010-12-13 12:25:52

标签: java comparison if-statement equals

我有一些应该相等的整数(我通过输出验证它)。但是在if条件下,Java没有看到这些变量具有相同的值。

我有以下代码:

if (pay[0]==point[0] && pay[1]==point[1]) {
    game.log.fine(">>>>>> the same");
} else {
    game.log.fine(">>>>>> different");
}
game.log.fine("Compare:" + pay[0] + "," + pay[1] + " -> " + point[0] + "," + point[1]);

它产生以下输出:

FINE: >>>>>> different
FINE: Compare:: 60,145 -> 60,145

可能我必须补充说point定义如下:

Integer[] point = new Integer[2];

pay取自循环构造函数:

for (Integer[] pay : payoffs2exchanges.keySet())

因此,这两个变量都具有整数类型。

6 个答案:

答案 0 :(得分:54)

对象(例如Integer s)不应通过==进行比较,而应通过.equals()进行比较。

重要的是要理解的是,几个不同的Integer对象可以表示相同的int值。当您的程序打印>>> different时,它只是说第一个对象与第二个对象不是相同的对象。 (虽然您可能希望根据它们代表的值来比较对象。)

来自official guide自动装箱:

  

[...] ==运算符对整数表达式执行引用标识比较,并对int表达式执行值相等比较。 [...]

值得注意的是,自动装箱可以保证在[-128,127]范围内为整数值返回相同的对象,但是实现可以自行决定缓存该范围之外的值。

我的一般建议是对所有本地/成员变量使用int而不是Integer。在这种特殊情况下,您似乎将坐标存储在一个2元素数组中。我建议你将它封装在Coordinates类或类似的中,并在这里覆盖equals方法(和hashCode)。

另见

答案 1 :(得分:12)

如果它们是简单的int类型,那就可以了。

在您的比较中Integer使用.intValue()compareTo(Object other)equals(Object other)

答案 2 :(得分:4)

这里有两种类型可以区分:

  • int,您大部分时间都在使用的原始整数类型,但不是对象类型
  • Integerint周围的对象包装器,可用于在需要对象的API中使用整数

答案 3 :(得分:2)

在java中,如果您尝试比较

,则会缓存-128到127范围内的数值
Integer i=12 ;
Integer j=12 ; // j is pointing to same object as i do.
if(i==j)
   print "true";

这样可行,但是如果您尝试使用上述给定范围内的数字,则需要将它们与equals方法进行比较,因为“==”将检查两者是否是相同的对象而不是相同的值。

答案 4 :(得分:1)

当你尝试比较两个对象(并且一个Integer是一个对象,而不是一个变量)时,结果将始终是它们不相等,

在您的情况下,您应该比较对象的字段(在本例中为intValue)

尝试声明int变量而不是Integer对象,这将有助于

答案 5 :(得分:0)

的条件
pay[0]==point[0]

表达式,使用等于运算符==来比较引用

Integer pay[0]

与参考

相等
Integer point[0]

通常,当将原始类型值(例如int,...)与==进行比较时,如果两个值相同,则结果为true。当引用(例如Integer,String,...)与==进行比较时,如果两个引用都引用内存中的同一对象,则结果为true。 要比较对象的实际内容(或状态信息)是否相等,必须调用一个方法。 因此,有了这个

Integer[] point = new Integer[2];

表达式,您创建一个新对象,该对象具有新引用并将其分配给点变量。

例如:

int a = 1;
int b = 1;
Integer c = 1;
Integer d = 1;
Integer e = new Integer(1);

比较a与b的使用:

a == b

因为它们都是原始类型值。

比较a与c的使用:

a == c

因为自动装箱功能。

用于比较c与e use:

c.equals(e)

因为e变量中的新引用。

比较c与d,使用更好,更安全:

  c.equals(d)

因为:

  

如您所知,应用于包装器对象的==运算符仅测试对象是否具有相同的内存位置。因此,以下比较可能会失败:

Integer a = 1000;
Integer b = 1000;
if (a == b) . . .
  

但是,Java实现可以选择将常见值包装到相同的对象中,因此比较可能会成功。这种模棱两可不是你想要的。解决方法是在比较包装器对象时调用equals方法。