自动装箱拆箱

2018-08-15  本文已影响13人  金馆长说

技术小黑屋的文章

什么是自动装箱拆箱?
这个概念是在java 1.5版本的时候引入的概念,只要解决的是1.5之前版本的原始类型和包装类型不能自动进行转换,这就导致了很多不必要的转型操作,装箱为的就是解决这个重复的转型操作,可以说是解放了程序员的双手。

比如把int 转换成 Integer这个叫做装箱,把Integer转换成int 这个叫拆箱,之前这种操作都需要手动进行。现在我们只要直接使用就行了,不需要关心转型的操作。其他原始类型byte,short,char,int,long,float,double和boolean对应的封装类为Byte,Short,Character,Integer,Long,Float,Double,Boolean。

如何转型

装箱

 public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

拆箱

/**
     * Returns the value of this {@code Integer} as an
     * {@code int}.
     */
    public int intValue() {
        return value;
    }

什么时候发生装箱拆箱
这种情况在编写代码的时候很常见,比如定义了一个int类型的值,但是它接收的是一个Integer类型的值。这个时候就发生一个装箱的操作,这是编译器自动完成的。相反Integer赋值一个int类的值,这就发生了拆箱操作。

1.5版本之前操作装箱操作需要调用方法进行转型。

Integer iObject = Integer.valueOf(3);
Int iPrimitive = iObject.intValue()

1.5版本之后直接编译器就给转换了

Integer iObject = Integer.valueOf(3);
Int iPrimitive = iObject.intValue()

自动装箱主要发生在两种情况,一种是赋值时,另一种是在方法调用的时候

赋值

 Integer age = 2;
 int maxAge = 20;

调用

public static Integer show(Integer iParam){
   System.out.println("autoboxing example - method invocation i: " + iParam);
   return iParam;
}

//autoboxing and unboxing in method invocation
show(3); //autoboxing
int result = show(3); //unboxing because return type of method is Integer

使用中注意问题

重复的对象创建

这里的循环就会创建5000个Interge对象,非常的损害系统的性能,因为sun+=i,i是一个原始类型在在做完原算操作后,就又赋值给了它的包装类型了,这个时候就相当与 Integer sum = new Integer(result),所以做运算的时候要注意这种类型转换的问题避免不必要的开销。

Integer sum = 0;
 for(int i=1000; i<5000; i++){
   sum+=i;
}
上一篇下一篇

猜你喜欢

热点阅读