基本类型是值类型、包装类是引用类型,需避开缓存陷阱(如Integer -128~127复用对象)、比较误用==、泛型强制要求包装类(因类型擦除依赖Object)、空指针风险(null拆箱抛NPE)及性能损耗。

面试中一提基本类型和包装类,很多人只答“一个是值、一个是对象”,结果就被追问卡住。关键不是背区别,而是避开几个高频失分点:缓存陷阱、比较方式错用、泛型硬伤、空指针隐患。
别用 == 比较包装类的值
这是最常被当场打断的点。Integer a = 100; Integer b = 100; System.out.println(a == b); 输出 true;但换成 200 就是 false。原因不是“相等不相等”,而是 Integer 在 -128~127 范围内复用缓存对象,超出就新建实例。
- 所有数值型包装类(Byte/Short/Integer/Long/Character)都有缓存机制,范围不全一样,不能凭感觉记
- Boolean 是特例:TRUE 和 FALSE 全局唯一,所以 Boolean a = true; Boolean b = true; 用 == 也安全
- 安全写法统一用 equals(),但要注意 null:a != null && a.equals(b),或用 Objects.equals(a, b)
泛型里必须用包装类,不是“可以”而是“只能”
面试官问“为什么 List
- ArrayList
编译后变成 ArrayList,运行时元素实际是 Object[],靠自动拆箱取 int 值 - Map
合法?不行。键可以是 String,但值必须是引用类型,int 不行,Integer 才行 - 自定义泛型类时,T 代表引用类型,所以 T t = null; 合法,但不能写 T t = 0;
警惕自动装箱拆箱引发的空指针和性能问题
Integer a = null; int b = a; —— 运行直接报 NullPointerException。拆箱时会隐式调用 a.intValue(),而 null 调方法必然炸。
立即学习“Java免费学习笔记(深入)”;
- 集合取值后直接赋给基本类型前,务必确认非空,尤其从 Map.get(key) 或 List.get(i) 拿出来的包装类
- 循环中频繁装箱(如 for(int i=0; i
- 方法参数是包装类时,明确文档是否接受 null;内部逻辑若需转基本类型,优先用 Optional 或判空处理
区分默认值与初始值,别混淆栈和堆
局部变量 int x; 编译不通过,必须显式初始化;而 Integer y; 编译通过,y 默认为 null。这不是“习惯问题”,是存储模型决定的:
- 基本类型在栈上分配,无默认值就不允许读;包装类是引用,在栈上存的是 null 引用,对象本身在堆上——没 new 就没有对象
- 成员变量(字段)有默认值:int 是 0,Integer 是 null。这个差异直接影响序列化、JSON 反序列化、数据库 ORM 映射行为
- boolean 和 Boolean 更容易踩坑:if (flag) 中 flag 是 Boolean 类型且为 null,会抛 NPE,而不是按 false 处理


















