什么是装箱和拆箱
装箱:将基本数据类型自动转化为对应的封装类
拆箱:将封装类自动转为对应的基本数据类型
Integer x=4;
x=x+5;
在上面的代码中,4首先自动装箱为Integer类对象赋值给x;然后,x与5运算的时候又自动拆箱为基本数据类型。
实际上,Integer在装箱过程中调用了Integer中的valueOf()方法,拆箱为int时调用了Integer中的intValue()方法。这两个方法的源码如下:
public static Integer valueOf(int i){
assert IntergerCache.high>=127;
if(i>=IntergerCache.low&&i<=IntergerCache.high)
return IntergerCache.cache[i+(-IntergerCache.low)];
return new Integer(i);
}
public int intValue(){
return value;
}
这便是自动装箱与拆箱的底层执行过程,其他封装类类似。
自动装箱和拆箱中的一些问题
问题1:
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
}
}
上面代码中“i1==i2”返回true,而“i3==i4”返回false。这是因为在源码中“i1==i2”返回true是因为100属于-128到127范围内,给i1和i2赋值的时候,直接返回cache[]数组中的对象,属于同一个对象,从而返回true;而200超过了这个范围,给i3和i4赋值的时候直接返回new Integer(),因此属于两个不同的对象,结果为false。
问题2:
public class Main {
public static void main(String[] args){
Double i1=100;
Double i2=100;
Double i3=200;
Double i4=200;
System.out.println(i1 == i2);//false
System.out.println(i3 == i4);//false
}
}
public static Double valueOf(double d){
return new Double(d);
}
从源码中可以得出Double封装类的valueOf()是返回一个新的封装类对象,因此“i1==i2”和“i3==i4”都返回false。
总结:
1.Integer派别:Integer,Short,Byte,Character,Long这几个类的valueOf()方法的实现是类似的,每次根据数据大小返回对象,有可能两次返回同一个对象,也可能是不同对象。
2.Double派别:Double,Float的valueOf()方法的实现是类似的,每次都返回不同的对象。
Integer派类
类型 | 相同对象范围 | 不同对象范围 |
Integer | (-128,128) | i>=128||i<-128 |
Short | (-128,128) | s>=128||i<-128 |
Character | c<128 | c>=128 |
Long | (-128,128) | v>=128||v<-128 |