【问题标题】:Why isn't Integer.MIN_VALUE equal to stored Integer.MIN_VALUE in variable?为什么 Integer.MIN_VALUE 不等于存储在变量中的 Integer.MIN_VALUE?
【发布时间】:2015-11-03 21:15:41
【问题描述】:

我创建了一个包含以下字段的 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

MINF == this.headfalse,虽然 this.head = -2147483648

Integer.MIN_VALUE == this.head

我是否遗漏了什么,为什么第二个是假的?

【问题讨论】:

标签: java integer minimum


【解决方案1】:

Integer 是包装类,是 Object 的子级,包含一个 int 值。

如果您只使用基本类型int== 会进行数值比较而不是对象地址比较。

注意Integer.MIN_VALUE 当然也是int

【讨论】:

    【解决方案2】:

    您错过了这样一个事实,即当存储在 Integer 中(即,您将 Integer.MIN_VALUE 存储在两个不同的整数中)并在它们之间使用 == 时,比较的不是值,而是对象。 这些对象不相同,因为它们是两个不同的对象。 当每个对象与 Integer.MIN_VALUE 进行比较时,由于 Integer.MIN_VALUE 是一个 int,因此该对象会自动拆箱并使用 int 比较进行比较。

    【讨论】:

      【解决方案3】:

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

      因为MINFhead 的独立对象,所以使用== 进行直接比较时您会收到错误。

      【讨论】:

        【解决方案4】:

        这里没有人解决为什么它们是不同的对象的原因。很明显:

        System.out.println(new Integer(10) == new Integer(10));
        

        输出错误,原因已在此问题的其他答案和Comparing Integer objects 中讨论到死

        但是,为什么会发生这种情况? 您似乎没有拨打new Integer。原因是:

        1. Integer.MIN_VALUE 返回 int,而不是 Integer
        2. 您已将MINF 定义为Integer
        3. 自动装箱使用valueOf。见Does autoboxing call valueOf()?
        4. 如果int 不在integer cache 中,valueOf 调用new Integer
          • 缓存仅包含 -128 -> 127 的值。

        就是为什么您看到“两个Integer 对象不是== 行为”,因为自动装箱。自动装箱也是为什么不相等的原因在这里似乎是可传递的。

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

        private static final int MINF = Integer.MIN_VALUE;
        

        而且,一般来说:不要将Integer 用于简单字段。;仅将其用作您实际需要该对象的泛型类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-12
          • 2022-11-16
          • 2013-09-24
          • 1970-01-01
          • 2017-04-21
          • 1970-01-01
          • 2022-11-18
          • 1970-01-01
          相关资源
          最近更新 更多