一、引入
- 目的:让
Object可以统一管理所有类型的数据。 - 包装类:基本数据类型所对应的对象类型,称为基本数据类型的包装类。
二、基本数据类型与包装类对应关系
- 所有包装类都在
java.lang包下,不需要手动导包。 - 包装类全部被
final修饰,没有子类。
表格
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
三、数据类型之间转换(以 Integer 为例)
3.1 int ↔ Integer
int 转 Integer
int a = 12;
// 方式1:构造方法
Integer i1 = new Integer(a);
// 方式2:静态方法 valueOf()
Integer i2 = Integer.valueOf(a);
Integer 转 int
// 成员方法 intValue()
int n = i2.intValue();
3.2 String ↔ Integer
String 转 Integer
String str = "222";
// 方式1:构造方法
Integer i3 = new Integer(str);
// 方式2:静态方法 valueOf()
Integer i4 = Integer.valueOf(str);
Integer 转 String
// 方式1:toString()
String s1 = i4.toString();
// 方式2:字符串拼接
String s2 = i4 + "";
四、int ↔ String 互相转换
int 转 String
int a2 = 32;
// 字符串拼接方式
String s3 = a2 + "";
String 转 int(开发重点)
String a = "18";
int age = Integer.parseInt(a);
⚠️注意: String 转为 Integer/int 时,字符串内容必须是纯数字,且不能超出 Integer 数值范围。 编译可以通过,运行时报异常:
java.lang.NumberFormatException数值格式转换异常。
五、自动装箱与自动拆箱
JDK5.0 新增特性,基本数据类型和对应包装类可以自动互相转换。
-
装箱:基本数据类型 → 包装类型
-
拆箱:包装类型 → 基本数据类型
// 自动装箱 int → Integer
Integer i1 = 12;// 自动拆箱 Integer → int
int a = i1;
自动装箱底层原理
自动装箱底层 JVM 调用Integer.valueOf(int n)完成转换。 valueOf核心源码:
public static Integer valueOf(int i){
if(i >= -128 && i <= 127){
return IntegerCache.cache[i+(-IntegerCache.low)];
}
return new Integer(i);
}
源码解读:
- 如果数值在
-128 ~ 127区间:直接从**Integer 缓冲区(缓存池)**返回对象。 - 如果数值不在该区间:
new Integer(i)新建对象。
缓冲区作用
Integer 预先把‑128~127范围内的包装对象缓存,存放在缓冲区。 目的:提高装箱效率,提升 JVM 内存利用率。
📝面试题:分析输出结果
Integer i1 = 12;
Integer i2 = 12;
System.out.println(i1 == i2); // true
Integer i3 = 255;
Integer i4 = 255;
System.out.println(i3 == i4); // false
解析: 12 属于
‑128~127缓存范围,i1、i2 指向缓存中同一个对象,==比较地址为 true。 255 超出缓存范围,两次装箱new两个不同对象,地址不一样,==结果 false。
六、包装类实际开发应用
- 使用场景:实体类属性,把基本数据类型替换为对应的包装类型。
- 目的:区分有效数据与无效数据。
举例:基本类型 int 默认值为 0,无法区分 "真实数值 0" 和 "没有赋值"; Integer 包装类默认值为
null,null 代表未赋值,0 代表真实业务数值。