Java 为什么Integer.MIN_值不等于变量中存储的Integer.MIN_值?

Java 为什么Integer.MIN_值不等于变量中存储的Integer.MIN_值?,java,integer,minimum,Java,Integer,Minimum,我创建了一个包含以下字段的Interval类: ... private static final Integer MINF = Integer.MIN_VALUE; Integer head,tail; ... 当我创建这个类的一个实例,使this.head=Integer.MIN_值,我想检查head的值是否等于MINF,它表示它们不相等 Interval i = new Interval(Integer.MIN_VALUE,10); System.out.println(i.toStrin

我创建了一个包含以下字段的Interval类:

...
private static final Integer MINF = Integer.MIN_VALUE;
Integer head,tail;
...
当我创建这个类的一个实例,使this.head=Integer.MIN_值,我想检查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\u值为真

MINF==this.head为false,尽管this.head=-2147483648

Integer.MIN_VALUE==this.head为true


为什么第二个为false,我遗漏了什么吗?

Integer是包装类,是Object的子类,包含int值

如果仅使用基本类型int,==进行数值比较,而不是对象地址比较


请注意Integer.MIN_值当然也是一个int。

Integer是包装类,对象的子类,包含一个int值

如果仅使用基本类型int,==进行数值比较,而不是对象地址比较


请注意Integer.MIN_值当然也是一个int。

您缺少一个事实,即当存储在Integer中时,您将Integer.MIN_值存储在两个不同的整数中,并在它们之间使用==进行比较,比较的不是值,而是对象。 这些对象不完全相同,因为它们是两个不同的对象。
将每个对象与Integer.MIN_值进行比较时,由于Integer.MIN_值是一个int,因此该对象将自动取消绑定并使用int比较进行比较。

您缺少一个事实,即当存储在Integer中时,将Integer.MIN_值存储在两个不同的整数中,并在它们之间使用==进行比较,但是物体的形状。 这些对象不完全相同,因为它们是两个不同的对象。 将每个对象与Integer.MIN_值进行比较时,由于Integer.MIN_值是一个int值,因此该对象将自动取消绑定并使用int比较进行比较。

您使用的是Integer对象。==的使用应仅用作单个原语值的比较。因为您使用的是Integer类而不是原语int,所以它比较的是两个变量之间的对象引用,而不是它们的值

因为MINF是一个单独的head对象,所以使用==,直接比较会收到false。

您使用的是整数对象。==的使用应仅用作单个原语值的比较。因为您使用的是Integer类而不是原语int,所以它比较的是两个变量之间的对象引用,而不是它们的值


因为MINF是一个单独的head对象,所以使用==,直接比较会得到false。

这里没有人说明它们是不同对象的原因。显然:

System.out.println(new Integer(10) == new Integer(10));
输出错误,原因已在本问题的其他答案和

但是,为什么会发生这种情况?您似乎没有调用新整数。原因是:

返回整数,而不是整数。 您已将MINF定义为整数 自动装箱使用valueOf。看见 如果int不在, 缓存仅包含值-128->127(含)。 这就是为什么您看到这两个整数对象不是==行为,因为是自动装箱。自动装箱也是平等在这里似乎不可传递的原因

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

private static final int MINF = Integer.MIN_VALUE;

一般来说,不要对简单字段使用整数。;仅在您实际需要对象的情况下将其作为泛型使用。

这里没有人说明它们是不同对象的原因。显然:

System.out.println(new Integer(10) == new Integer(10));
输出错误,原因已在本问题的其他答案和

但是,为什么会发生这种情况?您似乎没有调用新整数。原因是:

返回整数,而不是整数。 您已将MINF定义为整数 自动装箱使用valueOf。看见 如果int不在, 缓存仅包含值-128->127(含)。 这就是为什么您看到这两个整数对象不是==行为,因为是自动装箱。自动装箱也是平等在这里似乎不可传递的原因

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

private static final int MINF = Integer.MIN_VALUE;
一般来说,不要对简单字段使用整数。;仅当您实际需要对象时,才将其用作泛型类型。

可能重复的可能重复的