比较2个整数,奇怪的行为

Dat*_*yen 3 java

我写了简单的代码:

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);
}
Run Code Online (Sandbox Code Playgroud)

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

true
false
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*oun 7

Integers对象,==操作员可能只在[-128,127]之间的数字"工作"(在你预期的意义上 - 比较).看看JLS - 5.1.7.拳击转换:

如果被装箱值p是true,false,一个byte,或一个char在范围\ u0000的到\ u007f,或intshort数之间-128127 (含),然后让r1r2是任何两个装箱转换的结果p.情况总是如此r1 == r2.

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

  • "==运算符可能只适用于...之间的数字"这有点误导; `==`运算符无论数字如何都能正常工作(它正确检查引用相等性并报告true或false).问题不在于`==`不_work_,问题在于它没有做OP所期望的,主要是由于从大于127的值导出的整数不能保证引用相等. (2认同)