我使用以下字段创建了一个Interval类:
...
private static final Integer MINF = Integer.MIN_VALUE;
Integer head,tail;
...
当我创建此类的实例时,生成this.head = Integer.MIN_VALUE
,并且我想检查head的值是否等于MINF
,它表示它们不相等。
Interval i = new Interval(Integer.MIN_VALUE,10);
System.out.println(i.toString()); //[-2147483648,10]
所以我继续尝试打印值,
public String toString() {
...
//What the hell?
System.out.println("MINF == Integer.MIN_VALUE: " + (MINF == Integer.MIN_VALUE)); //true
System.out.println("MINF == this.head: " + (MINF == this.head)); //false
System.out.println("Integer.MIN_VALUE == this.head: " + (Integer.MIN_VALUE == this.head)); //true
...
return "*insert interval in format*";
}
其中说
MINF == Integer.MIN_VALUE
true
MINF == this.head
false ,但this.head = -2147483648
Integer.MIN_VALUE == this.head
true
我错过了第二个错误的原因吗?
答案 0 :(得分:8)
Integer是包装类,Object的子类,包含int
值。
如果仅使用基元类型int
,==
会进行数值比较,而不是对象地址比较。
请注意Integer.MIN_VALUE
当然也是int
。
答案 1 :(得分:6)
您遗漏的事实是,当存储在Integer中(即,将Integer.MIN_VALUE存储在两个不同的整数中)并在它们之间使用==时,比较不是值,而是对象。 对象不相同,因为它们是两个不同的对象。 当每个对象与Integer.MIN_VALUE进行比较时,由于Integer.MIN_VALUE是一个int,因此该对象被自动装箱并使用int比较进行比较。
答案 2 :(得分:3)
这里没有人解决原因,为什么他们不同的对象。显然:
System.out.println(new Integer(10) == new Integer(10));
输出错误,原因是在此问题的其他答案和Comparing Integer objects
中已经讨论过死亡的原因但是,为什么会发生这种情况? 您似乎没有打电话给new Integer
。原因是:
Integer.MIN_VALUE
返回int
,而不是Integer
。MINF
定义为Integer
valueOf
。请参阅Does autoboxing call valueOf()? valueOf
不在integer cache,new Integer
会调用int
,
-128 -> 127
。 是您看到"两个Integer
对象不是==
行为"的原因,因为自动装箱。 Autoboxing也是为什么在这里平等似乎不具有传递性。
您可以使用以下方法解决此问题:
private static final int MINF = Integer.MIN_VALUE;
而且,一般情况下:不要将Integer
用于简单字段。;只在实际需要对象的情况下将其用作通用类型。
答案 3 :(得分:0)
您正在使用Integer
个对象。 ==
的使用应仅用作单个基元值的比较。由于您使用了Integer
类而不是原始int
,因此它将比较两个变量之间的对象引用而不是它们的值。
由于MINF
是head
的单独对象,因此您使用==
进行直接比较时收到错误。