为什么同等操作员在这种情况下不能工作:
Integer act0 = Integer.valueOf(ac.split("-")[0]);
if (activite_alerte.getActivite().getIdActivite() == act0)) {
add_notif(profil, ao);
added = true;
break;
}
activite_alerte.getActivite().getIdActivite()
和act0
等于 439 ,但它没有效果,但其他价值却有效。
答案 0 :(得分:2)
您正在使用盒装整数类型Integer
。 Java允许使用==
对-128到+127范围内的值进行相等,因为这些是" canned"盒装值,因此参考比较将适用于该范围内的数字。但你的号码 - 439 - 太大了。
您应该使用.equals()
代替盒装类型。
我个人认为这是Java最恶毒的方面之一。
答案 1 :(得分:0)
考虑以下计划:
public class Test {
public static void main(String args[]) {
Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a == b);
}
}
此程序的输出为false
。对于float类型和整数类型,java具有基本类型(int
,long
,float
,double
,...),它们不是对象,对象是对象({{ 1}},Integer
,Long
,Float
,...),它们是对象。我们写的时候
Double
将值int a = 3;
int b = 3;
分配给基本类型的两个变量3
和a
。可以使用b
测试两个变量的相等性,在此示例中将返回==
。
但如果你这样写:
true
由于名为 autoboxing 的功能,这实际上是语法糖:
Integer a = 3;
Integer b = 3;
这里我们有两个变量,每个变量引用一个类Integer a = new Integer(3);
Integer b = new Integer(3);
的对象。 Integer
的两个实例是不同的,即使它们在语义上它们反映了相同的基础int值。在java中,应用于引用对象的变量的Integer
运算符测试两个变量是否相同,即它们是否引用相同的对象实例。因此
==
将打印Integer a = 3;
Integer b = 3;
System.out.println(a == b);
,因为自动装箱创建的两个整数是不同的。另一方面,这个:
false
将打印Integer a = 3;
Integer b = a;
System.out.println(a == b);
,因为true
是指在声明b
时由自动装箱创建的同一对象。
除了测试身份之外,对于非原始变量,您可以使用a
方法测试 equality 。所以这个:
equals()
将打印Integer a = 3;
Integer b = 3;
System.out.println(a.equals(b));
。 true
方法在equals()
类中定义,因此任何类都继承。 Object
中定义的那个检查身份,但是每个子类应该覆盖提供预期语义的方法。例如,在Object
的情况下,重新定义检查保存整数值的基元成员变量的标识。