A Debugging Mystery

这个问题是因为 Java 中 Integer 对象的缓存机制导致的。

在 Java 中,== 运算符比较的是对象的引用(内存地址),而不是对象的值。当你使用 == 比较两个 Integer 对象时,你实际上是在比较它们是否是同一个对象实例。

Java 为了优化性能,对于范围在 -128 到 127 之间的整数,会预先缓存对应的 Integer 对象。这意味着:

  • 当你创建值在 -128 到 127 范围内的 Integer 对象时,Java 会返回缓存中的对象
  • 当值超出这个范围时(如 128),每次创建都会生成新的对象实例

因此,当你比较两个超出这个范围的 Integer 对象时,它们是不同的对象实例,== 运算符返回 false。

Integer a = 127;
Integer b = 127;
a == b;  // 返回 true,因为 a 和 b 引用同一个缓存对象

Integer c = 128;
Integer d = 128;
c == d;  // 返回 false,因为 c 和 d 是不同的对象实例

所以要比较两个integer大小,需要使用equals方法。

public static boolean isSameNumber(Integer a, Integer b) {
    return a.equals(b);
}