一、先搞懂:什么是包装类?为什么需要它?
包装类(Wrapper Class),简单来说,就是「把基本数据类型包装成对象」的类。Java中8种基本数据类型,对应8个包装类,全部位于java.lang包下,无需手动导入。
很多初学者会疑惑:基本类型用着好好的,为什么要多此一举搞包装类?核心原因有4点,记牢这4点,就能理解包装类的价值:
- Java集合(List、Map、Set)只能存储对象,不能直接存储基本类型,包装类解决了这个问题;
- 泛型参数必须是对象类型,比如List合法,List会直接报错;
- 基本类型的默认值(如int=0、boolean=false)无法区分「未赋值」和「默认值」,而包装类默认值是null,能精准区分;
- 包装类提供了大量实用工具方法,比如类型转换、进制转换等,不用我们自己重复编写。
二、必背:基本类型与包装类对应关系
8种对应关系,大部分是「首字母大写」,只有2个特例,记准不踩坑,直接看表格:
| 基本数据类型 | 对应的包装类(java.lang包) | |
|---|---|---|
| byte | Byte | |
| short | Short | |
| int | Integer | |
| long | Long | |
| float | Float | |
| double | Double | |
| char | Character | |
| boolean | Boolean |
小技巧:记住两个特例(int→Integer、char→Character),其余直接首字母大写,永远不会错。
三、核心特性:自动装箱与自动拆箱
这是包装类最常用的特性,也是新手最容易混淆的点。简单来说,就是「基本类型和包装类之间,编译器自动完成转换」,不用我们手动调用方法。
1. 定义(通俗好记)
- 自动装箱:基本类型 → 包装类(比如 int → Integer)
- 自动拆箱:包装类 → 基本类型(比如 Integer → int)
2. 代码示例(一看就会)
// 自动装箱:int 自动变成 Integer,无需手动 new Integer(10)
Integer num = 10;
// 自动拆箱:Integer 自动变成 int,无需手动调用 num.intValue()
int i = num;
// 集合中自动装箱(最常用场景)
List<Integer> list = new ArrayList<>();
list.add(100); // 底层实际执行:list.add(Integer.valueOf(100));
3. 底层原理
很多人以为自动装箱/拆箱是“魔法”,其实底层是编译器帮我们调用了两个方法:
- 装箱:底层调用
包装类.valueOf(基本类型)(比如 Integer.valueOf(10)); - 拆箱:底层调用
包装类对象.xxxValue()(比如 num.intValue())。
四、面试高频:包装类缓存机制
这是包装类最常考的面试题,也是开发中容易踩坑的点——为了节省内存,部分包装类会对「常用值」做缓存,直接复用对象,而非每次都新建对象。
1. 缓存范围
不是所有包装类都有缓存,只有以下5个,缓存范围要记准:
- Byte、Short、Integer、Long:缓存范围是 -128 ~ 127;
- Character:缓存范围是 0 ~ 127;
- Boolean:缓存两个常量(TRUE 和 FALSE);
- Float、Double:无缓存(因为浮点型的常用值范围太广,缓存无意义)。
2. 经典面试题
看下面的代码,输出结果是什么?很多人会答错:
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 输出:true(命中缓存,同一个对象)
Integer c = 200;
Integer d = 200;
System.out.println(c == d); // 输出:false(超出缓存,新建两个对象)
关键提醒:包装类比较值,必须用 equals(),不要用 ==!
== 比较的是对象地址,equals() 才是比较值。上面的代码,正确的比较方式是:
System.out.println(c.equals(d)); // 输出:true(正确比较值)
五、开发避坑:空指针风险
包装类是对象,默认值是null,这就会带来一个致命问题:当包装类为null时,自动拆箱会报空指针异常(NullPointerException),这是开发中最常见的bug之一。
1. 易错代码
Integer num = null;
// 报错:NullPointerException(底层调用 num.intValue(),num为null)
int i = num;
2. 解决方案
使用包装类前,一定要先判空,推荐两种简单写法:
// 写法1:三目运算符判空(简洁)
int i = (num != null) ? num : 0;
// 写法2:Java 8+ 新方式(更优雅)
int i = Optional.ofNullable(num).orElse(0);
六、总结:核心知识点速记
最后整理一份核心要点,方便大家快速记忆,面试时直接套用:
- 8种基本类型对应8个包装类,两个特例:int→Integer、char→Character;
- 自动装箱/拆箱是编译器语法糖,底层调用valueOf()和xxxValue();
- Byte、Short、Integer、Long(-128~127)、Character(0~127)、Boolean有缓存;
- 包装类比较值用equals(),避免用==,防止缓存和地址问题;
- 包装类可能为null,自动拆箱前必须判空,避免空指针;
- 集合、泛型必须用包装类,不能用基本类型。
其实包装类的知识不算复杂,重点就是记住「对应关系、缓存机制、空指针避坑」这三点。掌握这些,不管是日常开发还是面试,都能轻松应对。
如果觉得这篇文章对你有帮助,欢迎点赞收藏~ 你们在使用包装类时,还遇到过哪些坑?评论区留言讨论吧!


被折叠的 条评论
为什么被折叠?



