Java包装类&拆装箱

99 阅读3分钟

引入

Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,开发者在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),如下表所示:

基本类型大小包装器类型
boolean/Boolean
char16bitCharacter
byte8bitByte
short16bitShort
int32bitInteger
long64bitLong
float32bitFloat
double64bitDouble
void/Void

包装类的作用

提供一种机制,将基本值“包装”到对象中,从而使基本值能够包含在为对象而保留的操作中,比如List中只能存入对象,不能存入基本数据类型,或者从带对象返回值的方法中返回。注意,java5增加了自动装箱和拆箱,程序员过去需手工执行的许多包装操作,现在可以由java自动处理了。

在开发中,接受用户输入的信息一般都是字符串类型,因此必须考虑如何将字符串类型转换为对应的基本数据类型。有些数据表示的是数值含义,如果要用于计算我们就需要将其转换为基本数据类型。

基本数据类型转换为字符串

  1. 直接在数值后加一个空字符串
  2. 通过String类静态方法valueOf ( )

字符串转为基本数据类型

  1. 包装类除了Character之外,都存在一个静态方法——parseXxx

自动装箱&拆箱

在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行:

Integer i = new Integer(100);

而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:

int i = 100;

这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。基本数据类型自动转换为对应的包装类型叫做装箱。

那什么是拆箱呢?顾名思义,跟装箱相对,就是自动将包装类转换为基本数据类型

Integer i = 10; //装箱

int index = i; //拆箱

包装类注意事项

包装类对象的初始值为null(是一个对象)

Java中除了float和double的其它基本数据类型,都有常量池

  • 整数类型:[-128,127]值在常量池
  • 字符类型:[0,127]对应的字符在常量池
  • 布尔类型: true,false在常量池

在常量池中的数据,会进行共享使用,减少频繁创建,从而提高性能,不在常量池会创建新的对象。

两个小例子:

b1 == b2由于是包装类,因此判断二者地址是否相同

public class Test {
    public static void main(String[] args) {
        Byte b1 = 127;  // 自动装箱
        Byte b2 = 127;  // 自动装箱

        System.out.println(b1 == b2);  // true
    }
}

由于整数类型128不在常量池中,无法共享。

public class Test {
    public static void main(String[] args) {
        Interger b1 = 128;  // 自动装箱
        Interger b2 = 128;  // 自动装箱

        System.out.println(b1 == b2);  // false
    }
}