一些平等的条件不起作用



为什么相等运算符在这种情况下不起作用:

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被赋值给两个基本类型的变量ab。可以测试这两个变量是否与==相等,在本例中,它将返回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));

将打印trueequals()方法在Object类中定义,因此任何类都继承。Object中定义的方法检查身份,但是每个子类都应该覆盖该方法以提供预期的语义。以Integer为例,重定义检查保存整数值的原语成员变量的身份。

最新更新