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

Rom*_*man 24 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]);
Run Code Online (Sandbox Code Playgroud)

它产生以下输出:

FINE: >>>>>> different
FINE: Compare:: 60,145 -> 60,145
Run Code Online (Sandbox Code Playgroud)

可能我必须添加这样point定义:

Integer[] point = new Integer[2];
Run Code Online (Sandbox Code Playgroud)

并且pay我们从环路构造采取:

for (Integer[] pay : payoffs2exchanges.keySet())
Run Code Online (Sandbox Code Playgroud)

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

aio*_*obe 59

对象(例如Integers)不应该通过==,而是通过.equals().

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

官方自动装箱指南:

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

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

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

也可以看看

  • 有趣的是,`<``>`等确实要拆箱! (2认同)

sje*_*397 12

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

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


Nay*_*ava 5

在 Java 中,-128 到 127 范围内的数值被缓存,因此如果您尝试比较

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

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