基础类型性能更优,因其直接存于栈中免去堆分配、地址跳转和gc开销;无null风险,默认值确定;循环中使用int比integer更高效。

选择基础类型,核心原因是性能更优——它省去了堆内存分配、地址跳转和垃圾回收的开销。
栈 vs 堆:访问速度差一个数量级
基础类型直接存于栈中,变量里就是值本身;引用类型变量只存地址,真实数据在堆里。每次读取引用类型,都要先查栈里的地址,再跳到堆中取数据,多一次内存寻址。而栈是线程私有、结构简单、分配释放极快,就像从口袋拿钥匙;堆是全局共享、需加锁协调、分配耗时,类似去银行柜台申请资金。
- int a = 100; → 值100就躺在栈帧里,CPU一步读取
- Integer b = 100; → 栈中存的是指向堆里某个Integer对象的指针,至少两次内存访问
没有 null 和 GC 压力
基础类型默认有确定值(如 int 默认 0,boolean 默认 false),不会触发 NullPointerException;引用类型默认为 null,未判空就调用方法极易崩溃。更重要的是,基础类型不参与垃圾回收——它们随方法结束自动出栈销毁;而每个 Integer、Double 对象都得被 GC 跟踪、标记、清理,高频创建时会显著拖慢吞吐量,甚至引发 STW(Stop-The-World)暂停。
- 循环中用 int i = 0; i
- 同场景用 Integer i = 0; i
泛型与集合中的隐式代价
虽然集合(如 ArrayList
- 避免在性能敏感循环中混用:不用 for (Integer x : list) { sum += x; },改用原始类型数组或 IntStream
- 批量计算优先选 double[] 而非 List
,尤其涉及科学计算或大数据处理
适用边界:什么时候不能绕开引用类型?
基础类型高效,但能力有限——它不支持 null 表达“缺失”语义,不能作为泛型参数,也没有方法可调用。所以当需要表达可选值(如数据库字段可能为空)、放入 Map 或 List、或需调用 parseInt()、toString() 等工具逻辑时,就必须用包装类。关键不是“全用基础类型”,而是清楚每处选择背后的成本权衡。
- 计数器、索引、数学运算 → 无条件选 int/long/double
- 配置项可能为空、API 返回可选数值 → 用 Integer/Long,但显式判空
- 高性能中间计算 → 先用基础类型完成,最后一步再封装成对象输出











