Java基本类型选型需按需最小化:≤127用byte,小范围计数用short,默认用int,高精度才用long;float比double省空间但有精度风险;避免习惯性用int,开关字段优先boolean;循环中禁用自动装箱,高频计算全用基本类型;变量就近声明初始化,减少冗余引用;基本类型误用常暴露内存隐患,需结合MAT、jstack等工具排查。

Java基本类型不是“能用就行”,而是内存效率和性能稳定的关键起点。用对了,能省下大量堆空间、减少GC压力;用错了,可能让一个高频服务平白多出几十MB内存开销。
基本类型选型:按需最小化
整数类型优先按数据范围选最小够用的:
- 年龄、状态码、HTTP状态(0–199)、枚举序号等 ≤ 127 的场景,用 byte(1字节)
- 短ID、小范围计数(如页面分页size),且确定不超过32767,可用 short(2字节)
- 默认整数用 int(4字节),除非明确需要更大范围才升级到 long(8字节)
- 浮点计算精度要求不高(如统计比例、简单折扣)时,float(4字节)比 double(8字节)更省空间,但注意精度丢失风险
避免“习惯性用int”——比如一个只存0/1的开关字段,用 boolean(JVM实际存储通常1字节)比用int节省3字节;数组中每百万个元素就少占3MB。
包装类 vs 基本类型:别在循环里自动装箱
Integer、Long等包装类是对象,有16字节对象头+实例字段+填充,比如一个Integer占24字节,而int只占4字节。
立即学习“Java免费学习笔记(深入)”;
- 循环中避免写
list.add(i)(i是int),若list是List<Integer>,会触发频繁自动装箱,产生大量临时对象 - 高频数值计算(如累加、坐标运算)全部使用基本类型,中间变量不包装
- 仅在泛型、集合、反射等必须引用类型的场景下才用包装类,并考虑缓存策略(如Integer.valueOf(127)复用缓存对象,但valueOf(128)每次新建)
变量声明与作用域:就近、一次赋值、避免冗余引用
声明位置直接影响栈帧大小和生命周期:
- 在方法内,变量尽量在首次使用前声明并初始化,如
int count = getCount();,而非先int count;再赋值 - 循环中创建对象引用,优先在循环体内声明(
for (...) { User u = new User(); ... }),现代JVM能更好优化局部变量栈空间复用 - 避免声明无意义的中间引用,例如
User user = getUser(); doSomething(user);可直接doSomething(getUser());,减少栈上冗余槽位
内存排查:从基本类型异常看深层问题
基本类型本身不会OOM,但它们的误用常暴露内存隐患:
- 大量
new Integer(x)或String.valueOf(int)在循环中调用 → 堆内存飙升、Young GC频繁 → 用MAT查java.lang.Integer实例数,定位代码位置 - 用
int[]模拟大缓存(如百万级ID数组),却忘了它本身占4MB(100万×4字节)→ 检查数组长度是否合理,考虑用Bitmap或布隆过滤器替代 - long时间戳、纳秒计时器未清理 → 表面是基本类型,但背后绑定的TimerTask、ScheduledFuture等持有强引用,导致对象无法回收 → 用jstack + jmap结合分析引用链
不复杂但容易忽略:基本类型是性能的底层支点,选得准、用得稳,才能让上层优化真正落地。



















