一些相同的条件没有奏效

时间:2015-08-05 11:40:50

标签: java equality

为什么同等操作员在这种情况下不能工作:

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 ,但它没有效果,但其他价值却有效。

2 个答案:

答案 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具有基本类型(intlongfloatdouble,...),它们不是对象,对象是对象({{ 1}},IntegerLongFloat,...),它们是对象。我们写的时候

Double

将值int a = 3; int b = 3; 分配给基本类型的两个变量3a。可以使用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的情况下,重新定义检查保存整数值的基元成员变量的标识。