一些平等的条件不起作用
Some equal condition didn't work
为什么等于运算符在这种情况下不起作用:
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 范围内的值使用 ==
相等,因为这些是 "canned" 盒装值,因此参考比较将适用于该范围内的数字。但是你的号码 - 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
。可以使用 ==
测试两个变量是否相等,在本例中将 return true
.
但是如果你这样写:
Integer a = 3;
Integer b = 3;
感谢名为 自动装箱 的功能,这实际上是以下语法糖:
Integer a = new Integer(3);
Integer b = new Integer(3);
这里我们有两个变量,每个变量都引用 class 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
class 中定义,因此任何 class 都会继承。 Object
中定义的检查身份,但每个子 class 应该覆盖该方法以提供预期的语义。例如,在 Integer
的情况下,重新定义会检查保存整数值的原始成员变量的身份。
为什么等于运算符在这种情况下不起作用:
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 范围内的值使用 ==
相等,因为这些是 "canned" 盒装值,因此参考比较将适用于该范围内的数字。但是你的号码 - 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
。可以使用 ==
测试两个变量是否相等,在本例中将 return true
.
但是如果你这样写:
Integer a = 3;
Integer b = 3;
感谢名为 自动装箱 的功能,这实际上是以下语法糖:
Integer a = new Integer(3);
Integer b = new Integer(3);
这里我们有两个变量,每个变量都引用 class 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
class 中定义,因此任何 class 都会继承。 Object
中定义的检查身份,但每个子 class 应该覆盖该方法以提供预期的语义。例如,在 Integer
的情况下,重新定义会检查保存整数值的原始成员变量的身份。