Java 中 Integer 对象比较陷阱
在 Java 开发中,直接使用 == 比较两个 Integer 对象的值往往会产生意想不到的结果。
现象
考虑以下代码:
Integer i = 128;
Integer j = 128;
System.out.println(i == j);
上述代码输出结果为 false。然而对于小数值:
Integer a = 100;
Integer b = 100;
System.out.println(a == b);
此时输出结果为 true。为什么会出现这种情况?
原理分析
Java 编译器在处理装箱操作时,会调用 valueOf 方法。查看 Integer.valueOf 的实现可以发现,为了避免重复创建对象,JVM 对 Integer 值做了缓存。
IntegerCache 是一个内部静态类,用于管理缓存数组。初始化时加载 JVM 配置,若未配置,默认缓存范围为 -128 到 127。
当数值在缓存范围内时,直接返回缓存对象(引用相同,== 为 true);超出范围则新建对象(引用不同,== 为 false)。
结论
在比较两个 Integer 对象的值时,无论声明方式如何,务必使用 equals 方法进行比较,严禁使用 ==。
Java 中没有重载操作符的概念,特别是从其他语言转至 Java 的开发者需注意此差异。


