我的程序包括以下代码段,它们根据两个变量temp.get(j1)和temp(j2)是否等效来执行某些操作。
for (int j1 =0; j1<2;j1++)
{
for (int j2 =0; j2<2;j2++)
{
System.out.println("j1="+j1+"j2="+j2+" "+temp1.get(j1)+"----"+temp2.get(j2));
int xyz = temp1.get(j1)-temp2.get(j2);
System.out.println("the difference is "+ xyz);
if (temp1.get(j1)==temp2.get(j2))
{
System.out.println("find match");
}
}
}
程序打印出类似的东西
j1=0j2=0 7698380----7698380
差值为0
即使temp1.get(j1)和temp2.get(j2)这两个值确实重叠,"if"部分也没有通过。如果我更改if (temp1.get(j1)==temp2.get(j2)) to
if (xyz == 0)
然后结果看起来像
j1=0j2=0 7698380----7698380
差值为0
查找匹配项`
我认为控制if循环的两个条件应该是相同的,为什么结果会如此不同?非常感谢你的回答。
Hm,temp1.get(j1)
是否返回Integer
而不是int
?如果是,则所讨论的Integer
不相同(即不等于)。即使从CCD_ 6的角度来看它们是相等的。
编辑:
解决这个问题的一种方法是使temp1和temp2返回int
而不是Integer
。您可以在这里使用简单的自动装箱(或者在本例中为自动取消装箱)。
例如,假设您的类是SithLord
,而您的integer属性是jediKills
。目前你的课程是这样的:
public class SithLord {
private Integer jediKills;
public Integer getJediKills() { return jediKills; }
}
你所要做的就是把它改成这个:
public class SithLord {
private Integer jediKills;
public int getJediKills() { return (jediKills == null ? 0 : jediKills); }
}
Java会自动将变量强制转换为int
。(注意,我在这里假设一个空整数是零。这个假设可能对你的职业有效,也可能不适用。但对于上面的职业来说,它是有效的,因为西斯领主肯定会宣传他的杀戮。)
或者你可以这样做:
public class SithLord {
private int jediKills;
public int getJediKills() { return jediKills; }
}
不管怎样,关键是如果您想在这里使用==运算符,那么类需要返回一个int
。
至于为什么这在过去可能对你有效,我只能猜测,因为我还没有看到代码。但可以肯定地说,如果==两边的引用都是一个,那么==就是真的。如果你对物体进行这种控制,就会发生这种情况。但是,如果您对基元类型进行自动装箱,您就放弃了,因为每次进行自动装箱时,Java都会在基元类型周围创建新的包装器。因为它们是新的,所以它们不会是同一个参考。
希望能有所帮助。
在java中,===运算符测试对象相等性(类似于PHP或Javascript中的===运算符)。如果temp.get()
返回Integer Object而不是int,并且temp2.get(j2)
没有指向与temp1.get(j1)
完全相同的对象,则temp1.get(j1) == temp1.get(j2)
的结果将为false。
Java中的每个对象都有一个.equals(Object other)
方法来执行语义相等(与PHP或Javascript中的==函数相同)。因此,只要temp2.get(j2)
包含与temp1.get(j1),
相同的数字,temp1.get(j1).equals(temp1.get(j2))`将为真。
减法和0的比较之所以有效,是因为您将结果设置为xyz,它的类型为int。当运行int jxyz = temp1.get(j1) - temp1.get(j2)
时,java编译器会自动将调用添加到Integer类的intValue()方法,该方法返回实际的int值。在Java中,int、float、char等都被认为是基本类型。对于基本类型,==运算符比较基本类型的值。
我意识到这与大多数其他语言处理变量比较的方式相比是令人困惑和倒退的。