Java中的装箱和拆箱

装箱和拆箱的定义

1
2
Integer i = 10;  //装箱
int n = i; //拆箱
  • 装箱: 自动将基本数据类型转换为包装器类型。
  • 拆箱: 自动将包装器类型转换为基本数据类型。

下表是基本数据类型对应的包装器类型:

基本数据类型 包装器类型
int Integer
byte Byte
short Short
long Long
float Float
double Double
char Character
boolean Boolean

装箱和拆箱的实现

装箱过程是通过调用包装器的valueOf方法实现的,而拆箱过程是通过调用包装器的 xxxValue方法实现的。(xxx代表对应的基本数据类型)。

1
2
Integer i = 10;  //相当于Integer i = Integer.valueOf(10);
int n = i; //相当于int n = i.intValue();

常见问题

1
2
3
4
5
6
7
8
9
10
11
12
public class Main {
public static void main(String[] args) {

Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;

System.out.println(i1==i2); //true
System.out.println(i3==i4); //false
}
}

当通过valueOf方法创建Integer对象时,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

弊端

自动装箱和拆箱虽然给我们编程提供了很多方便,但是使用不当容易产生大量的冗余对象,增加GC的压力。

0%