byte => Byte
boolean => Boolean
short => Short
char => Character
int => Integer
long => Long
float => Float
double => Double
使用包装对象原因:集合Collection只能接受对象,所以必须基本类型转换成包装类才能使用
装箱、拆箱
Integer i = new Integer(10);// 装箱
int value = i.intValue();// 拆箱
自动装箱、自动拆箱,好处是可以减少开发人员的工作量
Integer i =10;// 自动装箱
int b= i;// 自动拆箱
自动装箱和自动拆箱反编译后,得到:
Integer integer=Integer.valueOf(1);
int i=integer.intValue();
即自动装箱和自动拆箱函数:valueOf(int)、intValue()
哪些地方会自动装箱、自动拆箱?
(1)把基本类型放到集合中
(2)包装类型数值运算 Integer + Integer
(3)包装类型和基本类型使用 > < = 比较 if(Integer > int) if(Integer == Integer)
(4)包装类型逻辑运算 if(Boolean)
等等
注意:自动拆箱可能会引起NPE,典型例子:当3目运算第三个参数是基本类型,第二个参数是包装类型时,会对第二个参数拆箱,如果第二个参数为空,则会引发空指针异常
Integer i = null;
Integer x = ture ? i : 3;
由于i为null,且对i自动拆箱,所以引发NPE
Integer x = true ? i : Integer(3);
这时i不会自动拆箱,得到x为null而已
自动装箱的缓存问题,对于Integer
(1)使用自动装箱产生的对象
(2)范围在-128到+127之间
会直接返回Integer对象中缓存好的实例Integer,源码如下:
public static Integer valueOf(int i) {
// 范围在-128到+127之间,就在缓存中获取
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
private static class IntegerCache {
static final Integer cache[]; // 缓存中Integer的数组
}
所以:
Integer i = 8;
Integer j = 8;
System.out.print(i == j)
输出true,尽管是两个对象的比较,但实际比较是缓存中的地址,所以是一样的