POJO/DTO字段必须用包装类,因需表示null;局部计算优先用基本类型,省空间、少GC;泛型集合强制要求包装类;装箱拆箱需防空指针和==陷阱。

选基本类型还是包装类,关键看变量要承担什么角色——是做计算的“工人”,还是传数据的“信使”。不是哪个高级,而是哪个更贴合当前职责。
POJO 和 DTO 字段必须用包装类
数据库字段可能为 NULL,RPC 返回可能缺失,JSON 反序列化需要表示“无值”状态。用基本类型会把 null 强制转成默认值(比如 int 变 0),业务语义就丢了。
- 用户年龄字段写 Integer age,能区分“0 岁”和“未填写”
- 写 int age,反序列化遇到 null 会报错或静默转成 0,排查困难
- 阿里巴巴 Java 开发手册明确要求:所有 POJO 类属性必须使用包装类型
局部变量和计算场景优先用基本类型
方法内部的计数器、中间结果、数组元素等,不需要 null,也不进集合,那就直接用基本类型——省空间、少 GC、无装箱开销。
- 循环累加:用 int sum = 0,别用 Integer sum = 0
- 存大量数值:用 int[] data,比 List
内存省 3–5 倍 - for-each 遍历包装类集合时,sum += x 会隐式拆箱,高频下损耗明显
泛型和集合只能用包装类
Java 泛型擦除后需要对象类型,基本类型不能作为类型参数。这是语言硬性限制,没得商量。
立即学习“Java免费学习笔记(深入)”;
-
List
编译不通过;List 才合法 -
Map
可以;Map 不行 - 即使只是临时存几个数,只要进了集合,就得用包装类
注意装箱拆箱的坑
自动转换看着方便,但一不留神就掉进空指针或 == 判断陷阱里。
- 拆箱前务必判空:if (score != null) { int s = score; }
- 比较用 equals() 或先转基本值再比,别直接用 ==(Integer a = 128, b = 128; a == b 是 false)
- 手动装箱用 Integer.valueOf(100),不用 new Integer(100)(已废弃,且不走缓存)


















