1. 基本类型与包装类JVM 里差在哪维度基本类型int、long、boolean …包装类Integer、Long、Boolean …语义直接表示数值或真假引用类型实例在堆上通常可 null默认值字段数值为 0 / falsenull未初始化引用泛型 / 集合不能直接作类型参数可作 ListInteger 等类型实参内存局部变量多在栈帧里占槽位数组元素按类型连续排布对象对象头 字段受 GC 管理注意说「基本类型一定在栈上」只适用于方法内的局部变量这一常见情形成员字段随对象一起在堆上基本类型数组也在堆上只是元素不是对象引用。包装类对应关系byte↔Byteshort↔Shortint↔Integerlong↔Longfloat↔Floatdouble↔Doublechar↔Characterboolean↔Boolean。2. 缓存为什么127 127而128 ! 128用时Integer.valueOf(int)等对部分取值使用缓存的单例避免频繁new。Integer默认缓存-128127可通过 JVM 参数-XX:AutoBoxCacheMaxn调整上界有上限。Long缓存-128127。Short、Byte、Character也有固定范围缓存Character为0127。Float、Double不缓存常用值包装后是不同对象几乎总为false。BooleanTRUE/FALSE两个静态实例。Integer a 127, b 127; System.out.println(a b); // true同一缓存实例 Integer c 128, d 128; System.out.println(c d); // false两次 valueOf 可能各建新对象勿依赖 System.out.println(Integer.valueOf(100) Integer.valueOf(100)); // true在缓存内结论永远不要用比较两个包装类的数值是否相等一律Objects.equals(x, y)或显式x.equals(y)注意左侧 NPE。3.与equals该用谁场景建议两个 基本类型 值用 两个 包装类 是否「值相等」用 equals / Objects.equals其中一侧可能是 nullObjects.equals(a, b)Integer x null; // x.equals(y); // NPE Objects.equals(x, 1); // false安全equals在Integer等类中已按数值语义实现混合类型时注意自动装箱见下文。4. 自动装箱与拆箱编译器替你写了什么装箱基本类型 → 包装类常见为调用Integer.valueOf(i)而不是无脑new Integer。拆箱包装类 → 基本类型实质是intValue()等若引用为null拆箱会抛出NullPointerException。Integer n null; // int k n; // 编译成 n.intValue() → NPE典型场景三元表达式、重载解析、与null混写时容易隐式拆箱。Integer a null; Integer b 1; int bad condition ? a : b; // 拆箱 a → NPE // 或 Integer bad condition ? a : 1; // 1 是 int触发拆箱 → NPE5. 高频陷阱null参与运算map.get(key)得到Integer未判空就做int sum prev 1之类 → 引发NPE。比较Integer缓存区间外碰巧为true的情况不可依赖统一用equals。Boolean三态boolean只有true/falseBoolean可能为null。DAO / JSON 映射到Boolean时若当原始boolean用先规范化。性能与噪声热路径里无意义地装箱拆箱会增加分配与 GC 压力循环累加优先用int/long最后再装箱若 API 需要。Float/Double与精度包装类不改变浮点误差本质金额用BigDecimal。6. 业务代码的衔接JPA / Bean Validation实体字段常用包装类型表达数据库 NULL值基本类型往往映射成默认值0/false存在语义差异。JSON / REST DTO缺失字段常为null用Integer比int更能区分未传值与传值为 0——按 API 契约选型。集合Listint不可用必须用Integer流式 API 里注意mapToInt等方法避免不必要的装箱操作。7. 小结记住做法比数值包装类用 equals / Objects.equals防 NPE拆箱前 null 检查或 Optional.ofNullable别依赖缓存不把 当数值相等热路径尽量在基本类型上算边界再装箱参考java.lang.Integer.IntegerCacheJDK 源码JLS装箱转换boxing conversion、拆箱转换unboxing conversionjava.util.Objects#equals