【问题标题】:Compare 2 Integer numbers, strange behavior [duplicate]比较2个整数,奇怪的行为[重复]
【发布时间】:2015-02-17 00:45:58
【问题描述】:

我写了简单的代码:

public static void main(String[] args) {
    Integer i1 = 127;
    Integer i2 = 127;
    boolean flag1 = i1 == i2;
    System.out.println(flag1);

    Integer i3 = 128;
    Integer i4 = 128;
    boolean flag2 = i3 == i4;
    System.out.println(flag2);
}

但是,奇怪的是,结果如下:

true
false

你们能解释一下为什么会出现这种差异吗?

【问题讨论】:

标签: java


【解决方案1】:

Integers对象== 运算符可能“工作”(在您期望它做的意义上 - 比较 ) 仅适用于 [-128,127] 之间的数字。看JLS - 5.1.7. Boxing Conversion

如果被装箱的值 p 是 truefalsebyte,或 范围从 \u0000 到 \u007f,或介于 -128127 之间的 intshort 数字 (含),则设r1r2 为任意两个拳击的结果 p 的转换。 r1 == r2 总是这样。

您要比较的值不在范围内,结果被评估为false。你应该改用Integer#equals,或者干脆使用可爱的原语int

【讨论】:

  • 他也可以使用 int 来代替它。
  • “== 运算符可能仅适用于...之间的数字”这有点误导;无论数字如何,== 运算符都能正常工作(它正确检查引用相等性并报告真或假)。问题不在于== 不起作用,问题在于它没有达到 OP 的预期,主要是因为从大于 127 的值派生的整数不能保证引用相等.
  • @davmac “工作”是指根据 OP 的需要。不是运营商本身的功能。
  • @MarounMaroun 我明白这一点,但我建议你重新措辞,因为“工作”的一般含义远远超出“OP 需要什么”。
  • @davmac 谢谢,已编辑。我希望现在更清楚了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 2020-01-24
相关资源
最近更新 更多