选对基本数据类型是涉及内存路径、CPU指令与JIT优化的全程决策:优先用int/boolean/long而非包装类,用int[]而非List<Integer>,按需匹配范围与精度,善用char和boolean的原生特性,并发挥基本类型数组与System.arraycopy的底层性能优势。

选对基本数据类型不是微调,而是从内存路径、CPU指令到JIT优化的全程决策。核心原则就一条:能用基本类型,绝不碰包装类;能用小范围,不盲目升级大类型。
优先用基本类型,避开包装类陷阱
Integer、Double 等包装类每次参与运算都可能触发装箱/拆箱,背后是堆分配 + GC 压力 + 缓存不友好。而 int、double 直接走栈,零对象开销。
- 循环计数器、索引变量、状态标志一律用 int、boolean、long,别写
Integer i = 0 - 高频数学计算(如实时渲染、传感器数据处理)坚持用 double,不用
BigDecimal—— 后者每次加减都新建对象,性能差10–100倍 - 方法参数和返回值,只要语义允许,就传 int[] 而非
List<Integer>;前者连续内存,支持CPU向量化,后者是对象数组+指针跳转
按需匹配数值范围与精度
类型越大,内存占用越高,CPU搬运和计算成本也越高。64位操作在部分设备上比32位慢,尤其在移动或嵌入式场景。
- ID、状态码、HTTP状态、数组长度等通常 int 足够(±21亿),别默认上 long
- 毫秒时间戳可用 long,但若只表示“距某基准的秒数”且不超过21亿,int 更省空间、更缓存友好
- 浮点计算中,float 占4字节、double 占8字节;图形坐标、物理模拟等对精度不敏感场景,float 是合理选择
- 避免无意义使用
BigInteger或BigDecimal—— 它们适合金融结算等强一致性场景,但日常统计、聚合、中间计算全用基本类型保留在栈上
善用字符与布尔的底层特性
char 是16位无符号整数,boolean 在JVM中虽无统一字节定义,但编译器会尽量压缩。它们都不是“轻量替代品”,而是有明确语义和性能优势的原生类型。
立即学习“Java免费学习笔记(深入)”;
- ASCII范围内的单字符判断、编码转换(如大小写翻转)、简单哈希计算,直接用 char 运算,比转成
String或封装对象快得多 - 开关、标记、条件分支变量必须用 boolean,它不可与数字混用,杜绝了隐式转换错误,也让JIT更容易做分支预测和消除
- 不要用
int flag = 1模拟布尔逻辑;也不要为节省内存把多个 boolean 打包进一个 int 做位运算——现代JVM对独立 boolean 字段已足够友好,可读性和安全性远胜手工位操作
配合数组与拷贝机制发挥最大效能
基本类型数组(int[]、double[])是JVM最友好的内存结构,配合 System.arraycopy 可直达底层 memmove 或 SIMD 指令。
- 批量复制固定长度数据时,复用已分配的目标数组 +
System.arraycopy,比Arrays.copyOf少一次 new,高频场景省30%~50%时间 - 数组长度 ≥ 16 再用
arraycopy;≤ 4 元素的小拷贝,for 循环反而更快(无方法调用开销,JIT还可能向量化) - 原地移位(如删除数组某段、插入偏移)必须注意方向:左移正向拷,右移自动倒序,否则覆盖未读数据



















