基本类型性能优于包装类,因内存开销小且无装箱/拆箱;日常开发应按场景选择:计算密集用基本类型,集合泛型等必须用包装类,并善用valueof缓存与null语义。

基本类型性能明显优于包装类,核心差距来自内存开销和装箱/拆箱操作。日常开发中该选哪个,关键看场景——不是越“对象化”越好,而是越贴合需求越合理。
内存占用差异直接影响吞吐量
以 int 和 Integer 为例:
- int:固定占 4 字节,值直接存栈或对象内,无额外结构
- Integer:在 64 位 HotSpot JVM 中约需 24 字节(16 字节对象头 + 4 字节字段 + 4 字节对齐填充)
- 频繁创建 Integer(如循环中 new 或自动装箱),会快速消耗堆内存,触发 GC,拖慢整体响应
自动装箱/拆箱是隐藏的性能陷阱
看似简洁的写法,背后可能反复新建对象:
-
Integer sum = 0;→ 实际调用Integer.valueOf(0),返回缓存对象(-128~127 内安全) -
sum += i;(i 是 int)→ 先拆箱成 int,相加后又装箱为新 Integer,每次迭代都发生两次转换 - 实测百万次累加:用 long 耗时约 1.6 秒;用 Long 耗时约 15 秒,相差近 10 倍
集合与泛型场景下无法回避包装类
这不是妥协,而是设计约束:
-
List<int></int>编译不通过,必须用List<integer></integer> - Map 的 key/value、Stream 操作、JSON 序列化等均要求引用类型
- 此时应优先使用
Integer.valueOf(x)而非new Integer(x),复用缓存减少对象创建 - 若需高性能数值计算(如实时统计、批量处理),可考虑用
int[]或第三方库(如 Eclipse Collections 的 primitive collections)替代 ArrayList
null 语义与默认值风险不可忽视
性能之外,语义正确性常被低估:
- 成员变量声明为
int age→ 默认值 0,可能误判为“已设置年龄为 0” - 声明为
Integer age→ 默认 null,能明确表达“尚未录入” - 数据库映射、API 返回字段含 nullable 时,用包装类更贴近业务逻辑,避免用 0/-1 等魔法值掩盖真实缺失
- 但必须主动防御 null:调用前判空,或用
Objects.requireNonNull()、Optional 封装
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











