Java 包装类(Integer / Long / Double / Boolean)
Java 的基本数据类型不是对象,但在某些场景下需要将基本类型当作对象使用。为了解决这个问题,Java 为每个基本类型提供了对应的包装类(Wrapper Class)。本章将详细介绍包装类的概念和使用。
包装类概念
什么是包装类
包装类(Wrapper Class) 是将基本数据类型封装成对象的类。每个基本类型都有对应的包装类:
| 基本类型 | 包装类 | 大小 |
|---|---|---|
| byte | Byte | 8 位 |
| short | Short | 16 位 |
| int | Integer | 32 位 |
| long | Long | 64 位 |
| float | Float | 32 位 |
| double | Double | 64 位 |
| char | Character | 16 位 |
| boolean | Boolean | 1 位/1 字节 |
为什么需要包装类
- 集合框架需要:Java 集合(如 ArrayList)只能存储对象,不能存储基本类型
- 泛型需要:泛型只能使用引用类型
- 方法参数:某些方法需要对象类型
- 提供工具方法:包装类提供了很多有用的静态方法
// ❌ 错误:集合不能存储基本类型
// List<int> list = new ArrayList<>(); // 编译错误
// ✅ 正确:使用包装类
List<Integer> list = new ArrayList<>();
list.add(10);
list.add(20);
自动装箱 / 拆箱
装箱(Boxing)
装箱是将基本类型转换为对应的包装类对象。
手动装箱
// 手动装箱
int num = 10;
Integer integer = Integer.valueOf(num); // 方式 1:推荐
Integer integer2 = new Integer(num); // 方式 2:已废弃
自动装箱(Auto-boxing)
Java 5 引入了自动装箱,编译器会自动将基本类型转换为包装类:
// 自动装箱:编译器自动转换为 Integer.valueOf(10)
Integer integer = 10;
// 等价于
Integer integer = Integer.valueOf(10);
拆箱(Unboxing)
拆箱是将包装类对象转换为对应的基本类型。
手动拆箱
// 手动拆箱
Integer integer = Integer.valueOf(10);
int num = integer.intValue();
自动拆箱(Auto-unboxing)
Java 5 引入了自动拆箱,编译器会自动将包装类转换为基本类型:
// 自动拆箱:编译器自动转换为 integer.intValue()
Integer integer = 10;
int num = integer;
// 等价于
int num = integer.intValue();
自动装箱/拆箱示例
// 自动装箱
Integer a = 10; // 自动装箱
Integer b = 20; // 自动装箱
// 自动拆箱
int sum = a + b; // a 和 b 自动拆箱,然后相加
// 混合使用
Integer result = a + b; // a 和 b 自动拆箱,相加后自动装箱
// 集合中使用
List<Integer> list = new ArrayList<>();
list.add(10); // 自动装箱
int value = list.get(0); // 自动拆箱
注意事项
1. 空指针异常
Integer integer = null;
// int num = integer; // ❌ 运行时错误:NullPointerException
// ✅ 正确:先检查 null
if (integer != null) {
int num = integer;
}
2. 性能考虑
// 自动装箱/拆箱有性能开销
for (int i = 0; i < 1000000; i++) {
Integer num = i; // 每次循环都创建对象
}
// 在循环中尽量使用基本类型
for (int i = 0; i < 1000000; i++) {
// 使用基本类型,避免装箱
}
3. 比较陷阱
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 比较
System.out.println(c.equals(d)); // true
原因:Integer 在 -128 到 127 之间有缓存,超出范围会创 建新对象。
常用方法(parseXXX、valueOf、toString)
Integer 类常用方法
1. 字符串转整数
// parseInt:将字符串转换为 int
String str = "123";
int num = Integer.parseInt(str); // 123
// valueOf:将字符串转换为 Integer 对象
Integer integer = Integer.valueOf("123"); // Integer 对象
// 指定进制
int binary = Integer.parseInt("1010", 2); // 二进制:10
int hex = Integer.parseInt("FF", 16); // 十六进制:255
2. 整数转字符串
int num = 123;
// 方式 1:使用 toString
String str1 = Integer.toString(num); // "123"
// 方式 2:使用 String.valueOf
String str2 = String.valueOf(num); // "123"
// 方式 3:使用 + 连接
String str3 = "" + num; // "123"
// 指定进制
String binary = Integer.toBinaryString(10); // "1010"
String hex = Integer.toHexString(255); // "ff"
String octal = Integer.toOctalString(8); // "10"
3. 比较方法
Integer a = 10;
Integer b = 20;
// compareTo:比较大小
int result = a.compareTo(b); // -1(a < b)
// 返回:负数(小于)、0(等于)、正数(大于)
// equals:比较值
boolean equal = a.equals(b); // false
4. 其他常用方法
Integer num = 10;
// 获取基本类型值
int value = num.intValue();
long longValue = num.longValue();
double doubleValue = num.doubleValue();
// 获取最大值和最小值
int max = Integer.MAX_VALUE; // 2,147,483,647
int min = Integer.MIN_VALUE; // -2,147,483,648
// 判断是否为数字
boolean isDigit = Character.isDigit('5'); // true