我有一些应该相等的整数(我通过输出验证它)。但是在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())
因此,这两个变量都具有整数类型。
答案 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
,您大部分时间都在使用的原始整数类型,但不是对象类型Integer
,int
周围的对象包装器,可用于在需要对象的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方法。