为什么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方法。