选对整数类型可显著降低内存占用,核心原则是“刚好够用”:byte(1字节,-128~127)适用于状态码、像素值等;short(2字节,-32768~32767)适合音频采样、传感器数据;int(4字节,±21亿)为默认主力,覆盖多数业务场景;long(8字节)仅用于时间戳、分布式ID等大数需求。

选对整数类型,能实实在在压低内存占用,尤其在处理海量数据、嵌入式场景或高并发服务时效果明显。关键不是“用最小的”,而是“刚好够用”。
byte:1字节就搞定的小范围值
占1字节,范围-128~127。适合状态码、年龄、HTTP状态、像素灰度值(0~255)、协议字段等明确不会越界的数据。
- 数组场景最见效:声明 byte[] pixels = new byte[1000000] 比 int[] 节省约75%内存(4MB → 1MB)
- I/O操作天然适配:读写文件、网络字节流直接用byte,避免无谓转换
- 注意溢出:127 + 1 变成 -128,不报错但结果异常;运算前建议显式检查或转为int再算
short:2字节的中间选择
占2字节,范围-32768~32767。比byte宽裕,又比int节省一半空间,适合中等范围整数。
- 典型用途:音频采样值(-32768~32767)、传感器原始读数、小规模ID池、地图坐标偏移量
- 大量结构体/对象字段中使用:比如一个含10个short字段的POJO,在百万实例下可比全用int省下约8MB堆内存
- 不能自动提升为long:short参与算术运算时会先升为int,但存储本身仍省空间
int:默认主力,别乱替换成long
占4字节,范围约±21亿,覆盖绝大多数计数、索引、业务ID(如用户ID、订单号若≤21亿)、时间戳秒级值等场景。
- 优先选int:JVM对int做了深度优化,运算快、指令少、缓存友好
- 警惕“过度升级”:把本可用int的字段声明为long(如库存数量、页面访问数),白白多占4字节,百万条记录就是额外4MB
- 注意:数组索引、循环变量、HashMap容量等必须用int,Java语法强制要求
long:只在真需要大数时启用
占8字节,范围极大(±9×10¹⁸),专用于毫秒级时间戳、分布式唯一ID(如Snowflake)、银行账户余额、超大计数器等。
- 声明常量必须加L后缀:long ts = 1718467200000L; 否则超int范围会编译失败
- 包装类开销大:Long 对象比 long 基本类型多出对象头、引用等,至少多占12–16字节
- 慎用在集合中:ArrayList<Long> 比 ArrayList<Long>(误)→ 实际应是 ArrayList<Long> vs 数组 long[],后者内存连续、无装箱,性能和内存都更优
不复杂但容易忽略:类型选得准,不是抠细节,而是让每字节都干该干的活。

















