持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情
在Java中有8中基本数据类型,分别是byte,short,int,long,float,double,boolean,char。他们都有对应的包装类型,因为Java作为面向对象语言,所操作的都是对象,而这8种基本数据类型并不是对象,为了解决这个问题,Java将他们包装起来,形成了包装类,他们的对应关系如下:
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
装箱
Java将一个基本数据类型转为包装类型这个过程就叫装箱。
int index = 10;
Integer index1 = index;//1
Integer index2 = Integer.valueOf(index);//2
在上面这个过程中我们用了2种方式将int装箱转化为Integer,第一种方式是隐式装箱,Java自动帮我们完成,其实过程也是调用方式2中的Integer.valueOf(int)。
拆箱
装箱与装箱过程相反,是将包装类型转化为基本数据类型的过程。
int index3 = index2;
将上一步的Integer index2直接赋值给int index,在赋值过程中,Java帮我们自动完成拆箱工作。
自动拆箱与装箱
除了上面赋值的时候会完成自动拆箱装箱之外,Java中还有一些场景也会完成这个过程。
运算
int index = 10;
Integer integer = 10;
int index3 = index * integer;
由于运算符只能对基本数据类型运算,所以当包装类型和基本数据类型混合运算的时候,会自动拆箱成基本数据类型进行运算。
参数传递
int index = 10;
Integer integer = 10;
public void test() {
printIndex1(index);
printIndex2(integer);
}
public void printIndex1(Integer index) {
System.out.println(index);
}
public void printIndex2(int index) {
System.out.println(index);
}
在参数传递过程中,也会自动完成拆箱装箱操作。
区别
- 包装类是一个对象,创建的方式和对象一样,需要使用关键字new进行创建,而基本数据类型不需要。
- 基本数据类型存储在栈中,而包装类的对象存储在堆中,其对象的引用放在栈中。
- 包装类的初始值为null,基本数据类型的初始值与其类型有关,比如int初始值为0。
一些场景
Integer index1 = 10;
Integer index2 = 10;
Integer index3 = 300;
Integer index4 = 300;
System.out.println(index1==index2);//true
System.out.println(index3==index4);//false
我们知道,将int转变为Integer会执行装箱操作,而这个操作会new一个Integer对象,而==
判断的是对象地址,在上面这个例子中,按理说index1==index2
也是false才正确。
实际上,这是由于装箱操作会生成新的对象,而这个过程我们使用的又非常频繁,所以Java给我们提供了一个缓存池。
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
static final int low = -128;
static final int high = 127;
如果装箱的数据大小在缓存数据范围内,这直接获取缓存好的数据,否则重新调用new Integer()创建。