Java之自动装箱与自动拆箱
一、什么是自动装箱、自动拆箱
1 //自动装箱:将int数据转为一个Integer对象 2 Integer a = 99; 3 4 //自动拆箱:自动解析Integer对象,转换成int数据 5 int b = a;
简单而言,自动装箱与拆箱就是实现对象与数据之间的自动转换。
二、源码实现
1.自动装箱(Integer -> int):
//Integer a = 99; //经过编译,实际上运行的是这行代码 Integer a = Integer.valueOf(99); //接下来,让我们看一下Integer.valueOf()这个函数,这个函数是Integer类的静态函数,返回一个Integer对象 public static Integer valueOf(int i) { return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128]; }
接下来,让我们看一下Integer的构造函数,可以看到,这个对象内部实际是有一个value变量,由此可以知道,自动装箱的过程需要创造一个对象,消耗一定内存。
//Integer的构造函数 private final int value; public Integer(int value) { this.value = value; } public Integer(String string) throws NumberFormatException { this(parseInt(string)); }
2.自动拆箱(Integer -> int):
自动拆箱的过程比较简单,就是直接调用Integer.intValue()函数,在这里不多赘述:
public int intValue() { return value; }
三、注意事项
1.这里我们再来看一下Integer.valueOf()函数:
public static Integer valueOf(int i) { return i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128]; }
可以看到,Java已经预创建好了[-128,127]的Integer对象,因此当传入的数字处于这个范围时,创建的两个对象的地址一致;当超出这个范围时,创建的对象地址不一致,具体如下所示:
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 } }
2.Java预创建的对象范围: