在 Java 中,包装类(Wrapper Class) 是为 8 种基本数据类型 提供的对应的 引用类型(对象类型)。Java 的设计哲学强调“一切皆对象”,但基本数据类型(如 int、char 等)本身不是对象,无法直接用于需要对象的场景(例如集合、泛型、反射等)。因此,Java 为每种基本类型都设计了一个对应的包装类。
基本数据类型与包装类对照
注意:
int对应的是Integer,而不是Int;char对应的是Character,这是两个容易记错的特例。
面向对象支持:使基本类型也能以对象形式参与程序设计。
集合框架要求:Java 集合(如 ArrayList、HashMap)只能存储对象,不能直接存储基本类型。
// 错误 ❌:不能将 int 直接放入 ArrayList
ArrayList<int> list = new ArrayList<>(); // 编译错误!
// 正确 ✅:必须使用包装类
ArrayList<Integer> list = new ArrayList<>();泛型限制:泛型参数必须是引用类型,不支持基本类型。
提供实用方法:包装类提供了丰富的静态方法,用于类型转换、进制解析等操作。
从 Java 5 开始,编译器支持自动在基本类型和其包装类之间转换,这一特性称为 自动装箱 和 自动拆箱。
将基本类型自动转换为对应的包装类对象。
Integer num = 100; // 等价于 Integer num = Integer.valueOf(10);将包装类对象自动转换回基本类型。
int n = num; // 等价于 int n = num.intValue();空指针风险:如果包装类变量为 null,拆箱时会抛出 NullPointerException。
Integer x = null;
int y = x; // 运行时抛出 NullPointerException!性能开销:频繁装箱 / 拆箱会创建大量临时对象,影响性能(尤其在循环中)。
缓存机制:Integer、Byte、Short、Long、Character 在 -128 到 127 范围内会缓存对象,超出范围则新建对象。
Integer a = 127, b = 127;
System.out.println(a == b); // true(同一缓存对象)
Integer c = 128, d = 128;
System.out.println(c == d); // false(不同对象,应使用 .equals() 比较)包装类提供了静态方法,用于将 字符串 转换为对应的 基本类型或包装类型。
常用转换方法:
// 字符串 → 基本类型
int i = Integer.parseInt("123");
double d = Double.parseDouble("3.14");
boolean b = Boolean.parseBoolean("true"); // 注意:非 "true"(忽略大小写)都返回 false
// 字符串 → 包装类型(也会触发装箱)
Integer num = Integer.valueOf("123");
Double dbl = Double.valueOf("3.14");数值 → 字符串
String s1 = String.valueOf(123);
String s2 = Integer.toString(123);
String s3 = "" + 123; // 不推荐,可读性差如果字符串格式不合法,会抛出 NumberFormatException:
Integer.parseInt("abc"); // 抛出 NumberFormatException建议在不确定输入合法性时使用 try-catch 或先校验。