源本科技 | 码上会

Java 包装类

2026/01/29
47
0

什么是包装类

在 Java 中,包装类(Wrapper Class) 是为 8 种基本数据类型 提供的对应的 引用类型(对象类型)。Java 的设计哲学强调“一切皆对象”,但基本数据类型(如 intchar 等)本身不是对象,无法直接用于需要对象的场景(例如集合、泛型、反射等)。因此,Java 为每种基本类型都设计了一个对应的包装类。

基本数据类型与包装类对照

基本数据类型

包装类(引用类型)

byte

Byte

short

Short

int

Integer

long

Long

char

Character

float

Float

double

Double

boolean

Boolean

注意:int 对应的是 Integer,而不是 Intchar 对应的是 Character,这是两个容易记错的特例。


为什么需要包装类

  • 面向对象支持:使基本类型也能以对象形式参与程序设计。

  • 集合框架要求:Java 集合(如 ArrayListHashMap)只能存储对象,不能直接存储基本类型。

    // 错误 ❌:不能将 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!
  • 性能开销:频繁装箱 / 拆箱会创建大量临时对象,影响性能(尤其在循环中)。

  • 缓存机制IntegerByteShortLongCharacter-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 或先校验。