为什么Integer.MIN_VALUE不等于变量中存储的Integer.MIN_VALUE?

时间:2015-08-11 14:57:56

标签: java integer minimum

我使用以下字段创建了一个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

我错过了第二个错误的原因吗?

4 个答案:

答案 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 。原因是:

  1. Integer.MIN_VALUE返回int,而不是Integer
  2. 您已将MINF定义为Integer
  3. Autoboxing使用valueOf。请参阅Does autoboxing call valueOf()?
  4. 如果valueOf不在integer cache
  5. new Integer会调用int
    • 缓存只包含值-128 -> 127
  6. 是您看到"两个Integer对象不是==行为"的原因,因为自动装箱。 Autoboxing也是为什么在这里平等似乎不具有传递性。

    您可以使用以下方法解决此问题:

    private static final int MINF = Integer.MIN_VALUE;
    

    而且,一般情况下:不要将Integer用于简单字段。;只在实际需要对象的情况下将其用作通用类型。

答案 3 :(得分:0)

您正在使用Integer个对象。 ==的使用应仅用作单个基元值的比较。由于您使用了Integer类而不是原始int,因此它将比较两个变量之间的对象引用而不是它们的值。

由于MINFhead的单独对象,因此您使用==进行直接比较时收到错误。