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预创建的对象范围:

 

 


 

posted @ 2020-10-13 15:06  ChristianL  阅读(121)  评论(0编辑  收藏  举报