integer == 比较的是引用,因缓存机制,-128~127间值用同一对象,故==返回true;范围外则新建对象,==返回false;比较值应使用equals()或intvalue()。

这是因为 == 比较的是对象引用(内存地址),不是数值本身,而 Integer 在自动装箱时,对 -128 到 127 之间的整数做了缓存优化,范围外则每次新建对象。
Integer 的缓存机制是关键
Java 的 Integer.valueOf(int) 方法在装箱时会判断数值是否落在 [-128, 127] 区间内:
- 在此范围内:直接从
IntegerCache.cache[]数组中返回已存在的对象引用,多个变量指向同一块内存 →==返回 true - 超出此范围:调用
new Integer(value)创建新对象,每次分配独立堆内存 → 地址不同 →==返回 false
实际表现举例
以下代码结果很典型:
-
Integer a = 100; Integer b = 100; System.out.println(a == b); // true(共用缓存) -
Integer c = 200; Integer d = 200; System.out.println(c == d); // false(各自 new)
为什么设计成这样?
小整数(如循环计数、状态码、数组索引等)使用频率极高。缓存它们能减少对象创建开销、降低 GC 压力、提升性能。127 是 JDK 默认上限,但可通过 JVM 参数调整:-XX:AutoBoxCacheMax=200 或 -Djava.lang.Integer.IntegerCache.high=200
安全的比较方式
只要目的是比“值”,就别依赖 ==:
- 用
equals():自动处理 null,语义清晰 ——a.equals(b) - 转基本类型再比:明确意图,无空指针风险 ——
a.intValue() == b.intValue() - 如果确定非 null,且想兼顾性能,后者略快;但日常开发推荐
equals











