拆装箱,是将java中的原始数据类型、包装类进行装换的过程。是一种语法糖,主要是在编译阶段进行装换。生成了一样的字节码。

转换过程,以int和Integer为例

.java

Integer integer = 1;  // --> Integer.valueOf(0)
int unboxing = integer ++; // --> Integer.intValue(); 虚方法

.class:

invokestatic #2 // Method
java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
invokevirtual #3 // Method
java/lang/Integer.intValue:()I

为什么使用Integer.valueOf而不是new?

Integer.valueOf 可以使用到缓存,默认会缓存 -128^127的数字。 所以这儿涉及到<128,对象可能相等的情况

// 默认是-128~127,可通过参数配置
public static Integer valueOf(int i) {  
    if (i >= IntegerCache.low && i <= IntegerCache.high)  
        return IntegerCache.cache[i + (-IntegerCache.low)];  
    return new Integer(i);  
}

为什么原始数据类型比包装类更高效

  1. 内存使用方面 —> 对象头占用。 对象存储布局
  2. 处理速度