应根据场景选择基本类型或包装类型:需null语义时(如数据库NULL、RPC未传值、POJO字段)必须用包装类型;高频计算、循环、数组等性能敏感场景优先用基本类型。

Java 中基本数据类型和包装类型不是“怎么选择包装类型”,而是根据场景决定用基本类型还是包装类型。关键不在“选哪个包装类”,而在于“该不该用包装类”。
需要 null 表达业务语义时用包装类
当字段可能缺失、未设置或来自数据库 NULL 时,必须用包装类:
- 数据库映射:如 Integer age 可区分“0岁”和“年龄未知”,int age 默认是 0,语义模糊
- RPC/JSON 交互:DTO、VO、API 返回值中,字段未传入应为 null,而非默认值
- POJO 类属性:阿里巴巴 Java 开发手册强制要求使用包装类型(Integer、Boolean 等),禁止用 int、boolean
高频计算、循环、数组存储优先用基本类型
性能和内存敏感场景,基本类型更合适:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 方法内临时变量:如循环计数器 for (int i = 0; i ,不用 Integer i
- 大容量数值集合:用 int[] 而非 List<Integer> —— 后者每个元素多占约 12–16 字节对象头
- 数学运算密集逻辑:累加、比较、位运算等,避免隐式拆箱开销
泛型、集合、工具方法必须用包装类
Java 语法限制决定了这些场景无法使用基本类型:
立即学习“Java免费学习笔记(深入)”;
- 所有集合类:如 List<Integer>、Map<String, Boolean>,基本类型不能作为泛型实参
- 需要调用对象方法:如 Integer.toString()、Double.parseDouble()、Integer.max(a, b)
- 函数式接口参数:如 Consumer<Integer>、Function<String, Long>
装箱拆箱要避开常见陷阱
用了包装类,就得注意自动转换带来的风险:
- 比较别用 ==:超出 -128 ~ 127 范围的 Integer 对象用 == 比较会返回 false,应改用 equals() 或先判空再用 intValue()
- 拆箱前检查 null:如 Integer score = null; int s = score; 直接抛 NullPointerException
- 创建对象用 valueOf():如 Integer.valueOf(100) 复用缓存;new Integer(100) 已废弃且总新建实例

















