自动装箱拆箱
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。
如何转型
- 自动装箱编译器会在编译时调用valueOf()把原始类型进行转换,8原始类型的包装类都有一个valueOf()的方法,用与装箱操作。
- 自动拆箱编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。
装箱
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;
}