应优先选用最小够用的基本数据类型:年龄等≤127的值用byte(1字节),比int节省75%空间;数据库SMALLINT、屏幕宽高等场景宜用short;避免无谓使用包装类。

Java 基本数据类型本身不占堆内存,直接在栈上存值,这是优化的起点。关键不是“怎么让它们变小”,而是“选对类型、声明合理、避开包装类陷阱”,就能显著降低内存占用和 GC 压力。
按场景选最小够用的类型
整数优先看取值范围,而不是图省事全用 int:
- 年龄、HTTP 状态码(100–599)、RGB 分量(0–255)等 ≤127 的值,用 byte(1 字节),比 int 节省 75% 空间
- 数据库 SMALLINT 字段、屏幕宽高(如 1920×1080)、枚举状态码(short(2 字节)
- 循环计数器、数组索引、普通 ID 等仍推荐 int——JVM 对它有指令级优化,byte/short 反而会隐式提升为 int 运算,无实际收益
- 时间戳、文件大小、超大主键才用 long;注意字面量加 L 后缀(如
1234567890123L),避免编译错误
浮点与字符类型要权衡精度和开销
别默认 double,也别盲目 float:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
float(4 字节)适合传感器读数、游戏坐标、图像灰度值等对绝对精度不敏感的场景;声明时必须加 f 后缀(如
23.5f),否则编译器先生成 double 再转换 - double(8 字节)是默认浮点类型,金融计算、地理定位、科学模拟必须用它,避免 float 的累积误差(约 1e-7)
-
char 固定 2 字节(UTF-16),纯 ASCII 文本处理可考虑
byte[]+ 编码转换,但需自行管理编码逻辑;不要用 Character 包装类代替 char——对象头就占 12+ 字节,膨胀 6 倍以上
字段排列与数组使用有讲究
对象字段顺序和数组类型直接影响真实内存占用:
立即学习“Java免费学习笔记(深入)”;
- 多个字段共存时,按大小倒序声明:long/double → int/float → short/char → byte/boolean,能减少 JVM 8 字节对齐带来的填充浪费。例如
byte a; int b; byte c;实际占 16 字节,改成int b; byte a; byte c;可压到 12 字节 -
boolean[] 是特例:JVM 按位紧凑存储(1 bit/元素),远优于一堆独立 boolean 字段;大量开关/权限位优先用
boolean[]或 BitSet - 数值集合优先用 int[]、long[] 等原生数组,不用
List<Integer>——后者每个元素都是对象,内存多出 3–5 倍,还触发频繁装箱
严控包装类使用,避开装箱陷阱
包装类是内存和性能黑洞,除非必要,一律用基本类型:
- 局部变量、循环变量、方法参数、返回值——全部用 int、long、boolean 等,不用 Integer、Long、Boolean
- 泛型、Map 键值、需要 null 表达“未定义”时才用包装类;但比较要用
.equals(),别用==(-128 到 127 外的 Integer 不走缓存,每次 new) - 日志、Stream、Optional 中避免隐式装箱:log.info("id={}", idObj) 改成 log.info("id={}", idObj.intValue());Stream 计算用
mapToInt()而非map(x -> x.getValue())

















