Java基本类型性能更优,尤其在高频计算、集合操作和并发场景;应避免装箱拆箱,循环累加等场景必须用int等原始类型而非Integer。
Java基本类型用对了,性能提升是肉眼可见的——尤其在高频计算、集合操作和并发场景中。关键不是“能不能用”,而是“在哪用、怎么用、为什么这么用”。
避免装箱拆箱:让int真正是int
包装类(如Integer)在自动装箱/拆箱时会创建对象、触发GC,代价远高于想象。循环累加、数组遍历、计数器等场景必须用原始类型。
- 错误写法:Integer sum = 0; for (int i = 0; i —— 每次+=都发生一次装箱+拆箱
- 正确写法:int sum = 0; for (int i = 0; i
- 集合场景注意:ArrayList<Integer> 存的是对象;若只需数值运算且数据量大,考虑用第三方库(如Eclipse Collections的IntList)或数组替代
数组优先于泛型集合:当类型明确且操作简单时
基本类型数组(int[]、double[])没有泛型擦除开销,内存连续、访问快、无引用间接跳转,JIT也更容易优化。
- 适合场景:缓存批量ID、统计直方图、数学计算中间结果、DTO字段序列化前的临时结构
- 对比示例:处理10万条订单金额,用double[]比ArrayList<Double>节省约30%内存、GC压力降低50%以上
- 补充技巧:配合Arrays.sort()、System.arraycopy()等原生方法,比Stream或Collections工具类更轻量
局部变量与方法参数:用原始类型守住性能边界
栈上分配的原始类型访问极快,且不受GC影响。把性能敏感路径里的包装类参数、返回值、中间变量,全部拉回原始类型。
立即学习“Java免费学习笔记(深入)”;
- 方法签名优化:public long calculateTotal(int count, double unitPrice) 比 public Long calculateTotal(Integer count, Double unitPrice) 更直接、更安全
- 避免“隐式逃逸”:不要把原始类型临时包装成对象再传给日志框架或监控埋点(如log.info("count={}", count) 是安全的;但 log.info("data={}", Collections.singleton(count)) 就引入了不必要的对象
- 布尔与枚举:boolean比Boolean更省空间;状态标志优先用boolean或bit位(如用int的低8位表示8种开关),而非Enum对象(除非需语义强约束)
与JVM协同:理解底层如何对待基本类型
基本类型是JVM指令集的一等公民。理解这点,能避开很多“看似合理实则拖慢”的设计。
- 字节码层面:iload、istore、iadd等指令专为int设计,执行周期短;而invokestatic Integer.valueOf()多出方法调用+对象分配
- JIT优化友好:循环中纯int运算大概率被内联、向量化(如自动SIMD加速),而Integer对象无法享受这类优化
- 注意边界:long和double虽为基本类型,但在32位JVM上可能非原子读写(现代64位环境已基本无此问题,但仍建议volatile修饰时用AtomicLong保障)