Java 一些同等条件没有';行不通

Java 一些同等条件没有';行不通,java,equality,Java,Equality,在这种情况下,为什么相等运算符不起作用: Integer act0 = Integer.valueOf(ac.split("-")[0]); if (activite_alerte.getActivite().getIdActivite() == act0)) { add_notif(profil, ao); added = true; break; } activite\u alerte.getActivite().getIdActivite()和act0等于439,

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

Integer act0 = Integer.valueOf(ac.split("-")[0]);
if (activite_alerte.getActivite().getIdActivite() == act0)) {
    add_notif(profil, ao);
    added = true;
    break;
}

activite\u 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
,…),它们都是对象。当我们写作时

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
,因为声明
a
时,
b
引用自动装箱创建的相同对象

除了测试标识外,对于非基本变量,还可以使用
equals()
方法测试是否相等。因此:

Integer a = 3;
Integer b = 3;
System.out.println(a.equals(b));

将打印
true
equals()
方法是在
对象中定义的,因此任何类都会继承。
Object
中定义的方法检查标识,但每个子类都应该重写该方法以提供预期的语义。例如,在
Integer
的情况下,重新定义检查保存整数值的原语成员变量的标识

用equals()代替==你不应该用另一个吗