自动装箱与拆箱

自动装箱(Autoboxing)是Java编译器在原生数据类型和对应的封装类之间做的一种自动转换。比如把int转为Integer,double转为Double等等。如果这种转换过程倒过来,就叫拆箱(Unboxing)

自动装箱

这里是一个最简单的装箱例子:

Integer i=100;

这里把一个int型的常量100直接赋给了Integer型的变量i,在JDK1.5之前这样写会报错,但是1.5之后,这样写就没问题,因为系统有了自动装箱功能,原理其实就是调用了Integer类的ValueOf方法,这个ValueOf方法的源码如下:

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}
由此可见-128到127之间的int值在第一次自动装箱时会把值存进缓存中,第二次直接取缓存中的值,这也就是下面的程序结果出现的原理:

class Boxing{
	public static void main(String[] args) {
		Integer i1=10;
		Integer i2=10;
		System.out.println(i1==i2);//true
		Integer i3=127;
		Integer i4=127;
		System.out.println(i3==i4);//true
		Integer i5=128;
		Integer i6=128;		
		System.out.println(i5==i6);//false
	}
}
而JDK之所以要将1个字节能存下的整形值保存到缓存中,是因为这个范围的整形值比较常用, 用缓存可以提高效率和节省内存空间,这就叫享元设计模式。关于享元设计模式,请看这里。

拆箱

最简单的拆箱例子如下:

Integer i1=10;
int i2=i1;
这里的拆箱就是将Integer类型自动转换为int型。 

你可能感兴趣的:(自动装箱与拆箱)