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()代替==你不应该用另一个吗