正确使用包装类缓存可省对象、减gc、防==误判:优先valueof()或自动装箱,禁用new;比较一律用equals();integer可调-xx:autoboxcachemax扩缓存;byte/boolean/character有固定缓存范围,float/double无缓存。

用对缓存机制,能省对象、减GC、避免==误判——关键不是“有没有”,而是“怎么用”。
优先调用 valueOf(),别用 new
缓存只在 Integer.valueOf(100) 或自动装箱(如 Integer i = 100)时生效;new Integer(100) 每次都新建对象,绕过缓存,还浪费内存。
- ✅ 推荐写法:
Integer a = Integer.valueOf(120);或直接Integer b = 120; - ❌ 避免写法:
Integer c = new Integer(120);(Java 9+ 已弃用) - 注意:valueOf 对所有支持缓存的包装类都适用,比如
Byte.valueOf((byte)50)、Boolean.valueOf(true)
比较值时统一用 equals(),不依赖 ==
缓存让 -128~127 的 Integer 在 == 时可能为 true,但超出范围就 false;靠 == 判断极易出错,尤其当逻辑可能涉及 128 及以上数值时。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- ✅ 安全写法:
if (a.equals(b))—— 值相等即返回 true,与是否缓存无关 - ❌ 危险写法:
if (a == b)—— 在 127 时成立,128 就失效,线上难排查 - 特别提醒:Boolean、Character 等也同理,一律用 equals() 更稳妥
合理预估业务范围,必要时扩展 Integer 缓存上限
Integer 是唯一支持 JVM 参数调整缓存上限的包装类。若业务中高频使用 200 以内的 ID 或状态码(如 HTTP 状态 200/404/500),可考虑扩大缓存:
- 启动参数加:
-XX:AutoBoxCacheMax=500 - 效果:valueOf(300) 也会复用缓存对象(仍不改变 -128 下限)
- ⚠️ 注意:仅适用于明确高频且集中于某段整数的场景;盲目调大反而增加初始化开销和内存占用
了解各包装类缓存边界,按需选型
不同包装类缓存能力差异大,选对类型可减少意外新建:
- Byte:全范围缓存(-128 ~ 127),适合小整数标识(如协议字段、枚举序号)
-
Boolean:只缓存
TRUE/FALSE两个实例,永远复用,最安全 - Character:缓存 ASCII 字符('\u0000' ~ '\u007F'),处理英文/数字字符时可放心装箱
-
Float/Double:无缓存——别指望它们复用,值比较必须用
Double.compare(a,b)==0或Objects.equals()
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










