高频计算和循环中必须使用基本类型,避免自动装箱拆箱开销及空指针风险;不同JDK版本仅提供更优工具,核心在于按场景选型、规避陷阱、善用新特性。

Java 基本类型与包装类的优化,核心不在 JDK 版本切换,而在于**按场景选对类型 + 避开自动装箱陷阱 + 利用版本新增能力**。不同 JDK 版本只是提供了更安全、更高效的工具,但错误用法在任何版本下都会拖慢性能。
高频计算和循环中必须用基本类型
无论 JDK 8、17 还是 23,只要涉及密集数值运算(如累加、索引遍历、数学函数),都应直接使用 int、long、double 等基本类型。
- 包装类(如
Integer)每次参与运算都可能触发自动拆箱,隐式调用intValue();若对象为null,还会抛NullPointerException - JDK 1.5 引入自动装箱后,这种隐患更隐蔽——代码看着简洁,运行时却多出对象创建和方法调用开销
- 例如:
int sum = 0; for (int i = 0; i 比用 <code>Integer sum = 0;快 3–5 倍,且无 GC 压力
集合与泛型场景下谨慎使用包装类
因为 List、Map 等集合接口只接受引用类型,所以不得不使用 Integer、Boolean 等包装类。这时关键不是“能不能用”,而是“怎么用才不掉坑”:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 避免用
==比较两个包装类对象值:缓存范围外(如Integer.valueOf(200) == Integer.valueOf(200)返回false) - 优先用
Objects.equals(a, b)或显式调用.equals(),它会处理null安全比较 - JDK 21+ 可考虑
SequencedCollection配合原始类型数组预处理,减少中间包装;JDK 23 的switch支持byte/short/char/int,但依然不支持long和double
善用缓存机制,但别依赖构造器
从 JDK 5 开始,所有包装类都内置缓存策略,但各类型范围不同:
立即学习“Java免费学习笔记(深入)”;
-
Integer、Short、Byte、Character(0–127)、Long缓存默认为 -128 到 127;Boolean只缓存true/false两个实例 - 务必用
Integer.valueOf(100)替代new Integer(100),后者永远新建对象,绕过缓存 - JDK 17+ 中,可通过 JVM 参数
-XX:AutoBoxCacheMax=200扩展Integer缓存上限(仅影响valueOf,不影响new)
内存敏感场景优先选最小够用的基本类型
这不是某版本新特性,而是贯穿所有 JDK 的底层原则:能用 byte 就不用 int,能用 float 就不用 double。
- 比如 HTTP 状态码(100–599)、用户性别(0/1/2)、订单状态(1–10),用
byte(1 字节)比int(4 字节)节省 75% 内存 - 数组尤其明显:
byte[10000]占 10KB,int[10000]占 40KB;若存进ArrayList<integer></integer>,实际内存占用可达 160KB+(对象头 + 引用 + 值) - JDK 23 虽支持原始类型
switch,但不改变类型选择逻辑——它只是让byte和short在分支判断中更高效、更安全

















