Java 包装类基础
在 Java 中,基本数据类型(如 int、char、double)无法直接作为对象处理。为了解决这个问题,Java 提供了对应的包装类(Wrapper Classes),例如 Integer、Character、Double 等。将基本类型转换为对象的过程称为装箱(boxing),反之则为拆箱(unboxing)。
从 JDK 1.5 开始,Java 引入了自动装箱和拆箱机制。编译器会在需要时自动调用 valueOf() 或 xxxValue() 方法,这大大简化了代码编写,但开发者仍需了解其背后的原理以避免陷阱。
包装类的定义与作用
包装类使得基本数据类型可以作为对象参与泛型操作、集合存储以及方法参数传递。除了 Integer 和 Character 外,其余包装类名称均为对应基本类型的首字母大写形式。
性能与潜在风险
虽然自动转换很方便,但在高性能场景下需留意以下问题:
- 性能开销:频繁装箱会创建大量对象,增加 GC 压力;拆箱涉及方法调用。在循环或高频计算中应尽量避免。
- 空指针异常:包装类是引用类型,可以为 null。若对 null 进行拆箱(如
int value = nullInt;),会抛出 NullPointerException。 - 缓存机制:Integer、Boolean 等类对特定范围的值进行了缓存(如 Integer 为 -128 到 127)。在此范围内使用
==比较可能返回 true,但这依赖于实现细节,不可靠。 - 比较操作:比较两个包装类对象的值时,务必使用
equals()方法,而非==。后者比较的是内存地址。
public class BoxingUnboxingExample {
public static void main(String[] args) {
// 自动装箱:编译器隐式调用 Integer.valueOf(int)
int primitiveInt = 10;
Integer boxedInt = primitiveInt;
// 自动拆箱:编译器隐式调用 boxedInt.intValue()
int unboxedInt = boxedInt;
// 算术运算中的自动拆箱
Integer anotherBoxedInt = 20;
int result = boxedInt + anotherBoxedInt;
Integer.valueOf(primitiveInt);
explicitlyBoxedInt.intValue();
System.out.println( + primitiveInt);
System.out.println( + boxedInt);
System.out.println( + result);
}
}


