Java 基本数据类型与包装类:装箱拆箱机制全解析
在 Java 中,理解 基本数据类型和包装类 是非常基础但又容易出错的知识点。
不仅在日常开发中频繁使用,在面试中也经常被问到 装箱、拆箱、缓存机制、基本类型和引用类型的区别。
本文将系统讲解:
- Java 基本数据类型
- 包装类(Wrapper Class)
- 装箱(Boxing)与拆箱(Unboxing)
- 基本类型与包装类的转换
- 包装类缓存机制
- 面试高频问题总结
一、Java 基本数据类型
Java 提供 8 种基本数据类型:
| 类型 | 字节数 | 默认值 | 说明 |
|---|---|---|---|
| byte | 1 | 0 | 8位整数 |
| short | 2 | 0 | 16位整数 |
| int | 4 | 0 | 32位整数 |
| long | 8 | 0L | 64位整数 |
| float | 4 | 0.0f | 单精度浮点数 |
| double | 8 | 0.0d | 双精度浮点数 |
| char | 2 | '\u0000' | 单个字符 |
| boolean | 1 | false | 布尔值 |
特点
- 存储在栈内存
- 效率高
- 非对象类型,无法调用方法
示例:
java
int a = 10;
double b = 3.14;
boolean flag = true;
char c = 'A';
二、包装类(Wrapper Class)
Java 为每个基本类型提供了对应的包装类:
| 基本类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
特点:
- 是对象类型
- 提供方法操作数据
- 可用于集合(如
List、Map)中 - 可与基本类型相互转换(装箱/拆箱)
示例:
java
Integer i = 100; // 自动装箱
int j = i; // 自动拆箱
三、装箱与拆箱
3.1 装箱(Boxing)
将基本数据类型转换为对应包装类对象
java
int a = 10;
Integer i = Integer.valueOf(a); // 显式装箱
Integer j = a; // 自动装箱(Auto-boxing)
原理:
- 编译器会自动将
Integer j = a;转换成Integer.valueOf(a) - 避免每次都创建新对象,提升性能
3.2 拆箱(Unboxing)
将包装类对象转换为基本数据类型
java
Integer i = 100;
int a = i.intValue(); // 显式拆箱
int b = i; // 自动拆箱(Auto-unboxing)
原理:
- 编译器自动调用包装类的
xxxValue()方法 - 注意 包装类为 null 时拆箱会抛出 NullPointerException
示例:
java
Integer i = null;
int a = i; // 会抛出 NullPointerException
四、基本类型与包装类的转换
1. 基本类型 → 包装类
java
int a = 10;
Integer i = Integer.valueOf(a); // 推荐
Integer j = a; // 自动装箱
2. 包装类 → 基本类型
java
Integer i = 20;
int a = i.intValue(); // 显式拆箱
int b = i; // 自动拆箱
3. 字符串与包装类
java
String s = "123";
int a = Integer.parseInt(s); // 转基本类型
Integer i = Integer.valueOf(s); // 转包装类
五、包装类的缓存机制
Java 对 部分基本类型的包装类 会有 缓存机制,提高性能。
1. Integer 缓存
- 范围:
-128 ~ 127 - 使用
Integer.valueOf()会复用对象
示例:
java
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true
Integer a = 200;
Integer b = 200;
System.out.println(a == b); // false
原因:
- 超出缓存范围会创建新对象
- 缓存机制存在于 Byte、Short、Integer、Long、Character(-128~127)
2. Boolean 缓存
Boolean.TRUE和Boolean.FALSE是单例
六、面试高频点
自动装箱和拆箱原理
- 编译器自动调用
valueOf()和xxxValue()
缓存范围
- Integer / Long / Byte / Short / Character(-128~127)
- Boolean(true/false)
null 拆箱问题
java
Integer i = null;
int a = i; // NullPointerException
== 与 equals 的区别
java
Integer a = 100, b = 100;
System.out.println(a == b); // true,缓存范围
System.out.println(a.equals(b)); // true
Integer c = 200, d = 200;
System.out.println(c == d); // false
System.out.println(c.equals(d)); // true
七、总结
基本数据类型
- 存储在栈中
- 非对象,操作高效
包装类
- 对应基本类型的对象
- 可用于集合
- 提供方法操作数据
装箱与拆箱
- 装箱:基本类型 → 包装类
- 拆箱:包装类 → 基本类型
- 自动装箱/拆箱方便,但要注意 null 安全和性能
包装类缓存机制
- 提高性能
- 小整数和布尔值有缓存
- 注意
==和equals的区别