java基本类型与包装类是分工协作关系:基本类型高效但无法融入面向对象体系,包装类补足对象语义、支持集合与泛型;自动装箱/拆箱本质是语法糖,integer在-128~127有缓存;比较应优先用objects.equals();金额用bigdecimal或long,计数用int/long,开关用boolean,数据库空值映射用包装类。

Java面试中基本类型与包装类是必考项,不是考你背出八种类型,而是看你能不能讲清设计逻辑、踩过哪些坑、在真实场景里怎么选。下面从四个最常被追问的方向说清楚。
为什么要有包装类?不是已经有基本类型了吗
基本类型高效但太“原始”,没法融入Java的面向对象体系。比如集合类只认对象,List
- 基本类型:栈上存值,快、轻、不能为null
- 包装类:堆上存对象,带方法、可null、能进集合、支持泛型
- 二者不是替代关系,是分工协作——性能敏感处用基本类型,需要对象语义时用包装类
自动装箱/拆箱到底发生了什么
这是语法糖,不是魔法。写Integer i = 100,编译器悄悄替你写了Integer.valueOf(100);写int j = i,实际调的是i.intValue()。关键点在于:valueOf() 方法有缓存机制。
- Integer缓存范围是-128到127(可由JVM参数调整),这个区间内重复创建会复用已有对象
- 所以Integer a = 127; Integer b = 127; a == b返回true,但a = 128; b = 128就返回false
- Float和Double的valueOf没有缓存,每次都是新对象;Boolean的TRUE/FALSE是静态常量,永远==成立
比较操作最容易掉坑的地方
用==还是equals,取决于你想比什么。
- 基本类型之间用==,比的是数值,没问题
- 包装类之间用==,比的是引用地址——除非确认在缓存范围内,否则结果不可靠
- 安全做法:统一用equals(),但要注意null判空,否则拆箱时可能抛NullPointerException
- 更稳妥写法:Objects.equals(a, b),内部已处理null
金额、计数、开关这些场景该怎么选类型
类型选择不是看“顺不顺手”,要看业务语义和精度要求。
- 金额计算不用float/double,它们基于IEEE 754,天生存在精度误差;该用BigDecimal,或至少用long以“分”为单位存储整数
- 循环计数、数组下标、ID生成等,优先用int或long,避免无谓的装箱开销
- 开关状态用boolean,别用int(0/1)或String("true"/"false"),语义不清还浪费内存
- 从数据库查出来的数值字段映射到Java,如果可能为空,必须用包装类(如Integer);确定非空才用基本类型(int)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











