java包装类缓存机制中,integer在-128至127范围内自动缓存,valueof和自动装箱均复用对象,故==比较可能为true;超出范围或float/double则新建对象,==恒为false;安全比值应统一用equals()。

Java 中包装类的缓存机制主要体现在 Integer、Byte、Short、Long、Character 和 Boolean 上,其中最典型、最常被考察的是 Integer 缓存。它影响的是用 == 比较两个包装类变量时的结果——是否相等,取决于它们是否指向同一个缓存对象。
Integer 缓存范围是 -128 到 127
Java 对 Integer 类在 -128 至 127(含)之间的值做了自动缓存。调用 Integer.valueOf(int) 时,若参数在此范围内,会直接返回缓存中的对象;超出则新建对象。
-
Integer a = Integer.valueOf(100);→ 返回缓存对象 -
Integer b = Integer.valueOf(100);→ 同样返回同一个缓存对象 - 所以
a == b为 true - 但
Integer c = Integer.valueOf(200);和Integer d = Integer.valueOf(200);虽然值相同,却各自新建对象,c == d为 false
自动装箱也走缓存逻辑
使用 Integer a = 100; 这种自动装箱写法,底层实际调用的就是 Integer.valueOf(100),因此同样享受缓存。
-
Integer x = 127;和Integer y = 127;→x == y是 true -
Integer m = 128;和Integer n = 128;→m == n是 false - 注意:
int p = 128, q = 128;用基本类型比较,p == q总是 true,和缓存无关
其他包装类的缓存情况
不同包装类缓存策略不同,不能一概而论:
-
Boolean:只缓存
true和false两个对象 →Boolean.TRUE == Boolean.valueOf(true)为 true - Byte、Short、Long:只缓存 -128 ~ 127(与 Integer 相同)
- Character:缓存 '\u0000' 到 '\u007F'(即 0~127 的 ASCII 字符)
-
Float 和 Double:不缓存 →
Double.valueOf(1.0) == Double.valueOf(1.0)恒为 false
安全比较值应该用 equals(),不是 ==
依赖缓存做 == 判断容易出错,尤其在值可能超出缓存范围时。正确做法是统一用 equals() 比较逻辑值:
-
Integer a = 200, b = 200;→a == b是 false,但a.equals(b)是 true -
Integer c = null;→ 调用c.equals(d)前需判空,或用Objects.equals(c, d)避免 NPE - 对于基本类型与包装类混合比较(如
int i = 100; Integer j = 100;),i == j会触发自动拆箱,结果可靠,但本质已不是对象比较
== 判断包装类是否“相等”,本质上是在判断是否为同一对象,而非值是否相同。真正想比值,就用 equals()。Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











