为什么相等运算符在这种情况下不起作用:
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但它不起作用,而其他值不起作用
您使用的是盒装整型Integer
。Java允许对-128到+127范围内的值使用==
表示相等,因为这些值是"罐装"的盒装值,所以引用比较将适用于该范围内的数字。但是你的号码——439——太大了。
对于盒装类型,应该使用.equals()
。
我个人认为这是Java最有害的方面之一。
考虑以下程序:
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
。对于浮点型和整型,java的基本类型(int
, long
, float
, double
,…)不是对象,而对应的对象类型(Integer
, Long
, Float
, Double
,…)是对象。当我们写
int a = 3;
int b = 3;
值3
被赋值给两个基本类型的变量a
和b
。可以测试这两个变量是否与==
相等,在本例中,它将返回true
。
但是如果你这样写:
Integer a = 3;
Integer b = 3;
由于自动装箱的特性,这实际上是语法糖:
Integer a = new Integer(3);
Integer b = new Integer(3);
这里有两个变量,每个变量引用一个类Integer
的对象。Integer
的两个实例是不同的,尽管它们在语义上反映了相同的底层int值。在java中,==
运算符应用于引用对象的变量,测试两个变量是否相同,即它们是否引用相同的对象实例。因此
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
时自动装箱创建的相同对象。
除了测试同一性之外,对于非原语变量,您可以使用equals()
方法测试是否相等。所以这:
Integer a = 3;
Integer b = 3;
System.out.println(a.equals(b));
将打印true
。equals()
方法在Object
类中定义,因此任何类都继承。Object
中定义的方法检查身份,但是每个子类都应该覆盖该方法以提供预期的语义。以Integer
为例,重定义检查保存整数值的原语成员变量的身份。