Integer缓存范围为-128到127,由IntegerCache预创建并复用;valueOf在该范围内返回缓存对象,否则新建;==比较引用,故应优先用equals比较值。

Integer缓存范围是-128到127
Java中Integer类内部有一个静态内部类IntegerCache,它在类加载时就预先创建了从-128到127共256个Integer对象,并缓存在数组中。这个范围是JVM规范强制要求的最小缓存区间,实际高值可通过系统属性java.lang.Integer.IntegerCache.high扩大(如设为200),但低值-128不可更改。
valueOf方法决定是否复用缓存对象
当你写Integer a = 100;或显式调用Integer.valueOf(100)时,JVM会进入valueOf逻辑:
- 若参数在[-128, 127]内,直接返回缓存数组中对应位置的对象引用
- 若参数超出该范围(如128、-200),则执行new Integer(i),在堆上新建对象
注意:new Integer(100)永远绕过缓存,无论数值多少,都会创建新对象。
==比较的是引用,不是值
这是陷阱的核心——==判断两个变量是否指向同一内存地址,而非数值是否相等:
- Integer a = 5; Integer b = 5; → a == b 为 true(都指向缓存中的同一个Integer(5))
- Integer c = 200; Integer d = 200; → c == d 为 false(各自new,地址不同)
- Integer e = 5; Integer f = new Integer(5); → e == f 为 false(一个来自缓存,一个来自堆)
安全比较应当用equals或先转int
只要涉及Integer对象间的值比较,应避免无条件使用==:
- 推荐统一用a.equals(b):Integer的equals方法会先判null,再自动拆箱比较数值,语义清晰且安全
- 若确定非null,也可用a.intValue() == b.intValue()或a == b || a.equals(b)兜底(但不简洁)
- 与基本类型int比较时(如Integer a = 100; int b = 100;),==可安全使用,因为会触发自动拆箱

















