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

我有应该是相等的整数(我通过输出validation它)。 但在我的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]; 

并从循环构造函数中获取:

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

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

不应通过== ,而是通过.equals()来比较对象(如Integer .equals()

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

从官方自动装箱指南 :

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

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

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

也可以看看

  • 自动装箱简介
  • 比较数字与“==”时的自动装箱陷阱

如果它们是简单的int类型,它将起作用。

对于Integer使用.intValue()compareTo(Object other)equals(Object other)

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

  • int ,大多数时候使用的原始整数类型,但不是对象类型
  • Integer ,一个int的对象包装器,可用于在需要对象的API中使用整数

在java中,如果您尝试进行比较,则会缓存-128到127范围内的数值

 Integer i=12 ; Integer j=12 ; // j is pointing to same object as i do. if(i==j) print "true"; 

这可行,但是如果你尝试使用上面给出的数字给出范围,他们需要与equals方法进行比较,因为“==”将检查两个是否是同一个对象不是相同的值。

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

在你的情况下,你应该比较对象的字段(在这种情况下intValue)

尝试声明int变量而不是Integer对象,它会有所帮助

条件在

 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 

因为自动拳击function。

比较c与e使用:

 c.equals(e) 

因为e变量的新引用。

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

  c.equals(d) 

因为:

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

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

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