优先使用基本类型而非包装类,仅在需null语义或泛型约束时选用包装类;高频计算、循环变量、数组元素等必须用int/long等基本类型,可节省3–5倍内存;POJO中可选数值字段用Integer,比较时用Objects.equals();boolean[]和byte[]比包装类更省内存。

优先用基本类型,只在必须用对象特性时才选包装类。关键不是“能不能用”,而是“有没有必要多花几倍内存”。
高频计算和循环里必须用基本类型
比如遍历百万级数组做加减乘除,用 int[] 比 List
- 循环变量、临时计算变量、数组元素,一律用 byte/short/int/long 等基本类型
- 避免写
for (Integer i : list),改用索引遍历 +int变量 - 数学运算中别混用包装类,比如
sum += obj.getValue()中getValue()返回 Integer,会反复触发自动拆箱
集合和泛型场景下谨慎用包装类
泛型强制要求对象,所以 List 不可避免。但能不用就不用,尤其数据量大时:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- 用
int[]、long[]替代ArrayList,配合Arrays.sort()或自定义逻辑 - 需要频繁增删查?考虑
IntArrayList(来自 fastutil 或 Eclipse Collections),底层仍是原始数组 - Map 的 key 如果只是小整数(如状态码 0–100),可用
Object2IntMap或Int2ObjectMap减少装箱
需要 null 表达语义时才用包装类
POJO 字段、数据库映射、API 响应体里,如果某个值可能“不存在”,用 Integer 比 int 更合适——因为 int 默认是 0,无法区分“没传”和“传了 0”。
- DTO/VO/Entity 中的可选数值字段:用
Integer age,不是int age - 但注意:比较时别用
==,要用Objects.equals(a, b)或先判空再用.equals() - 构造或赋值时用
Integer.valueOf(127),别用new Integer(127);-128 到 127 范围内复用缓存对象
布尔和字符类型也有优化空间
boolean 和 char 看似小,滥用包装类一样吃内存:
- 大量开关标志?用
boolean[]或BitSet,比List节省 90%+ 内存 - 纯 ASCII 字符处理(如协议字段、状态码)?考虑用
byte[]存储,比char[]少一半空间(char 是 2 字节) - 避免
Character ch = 'A'这种单字符包装,除非要放进泛型容器
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










