java1.5增加了自动装箱(autoboxing)和自动拆箱(auto-unboxing)。
基本类型和装箱基本类型的区别:
1:基本类型只有值,而装箱类型则具有与它们的值不同的同一性
2:基本类型只有值,而装箱类型除了它对应基本类型的所以功能值之外,还有个非功能值:null
3:基本类型通常比装箱类型更节省时间和空间
Comparator<Integer> naturalOrder = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1 < o2 ? -1 : (o1 == o2 ? 0 : 1);
}
};
System.out.println(naturalOrder.compare(new Integer(10), new Integer(10)));
//结果是1
原因:对表达式计算o1 < o2会导致Integer实例被自动拆箱,然后执行表达式o1 == o2,它在两个对象引用上执行同一性比较,如果o1和o2引用表示同一个int值的Integer实例,结果返回false。
对装箱类型运用==操作符几乎总是错误的
static Integer i;
public static void main(String[] args) {
if(i==42)
System.out.println("Unbelievable");
}
//结果java.lang.NullPointerException
原因:i是一个Integer,而不是一个int,所有初始值是null
当在一项操作中混合使用基本类型和装箱类型时,装箱类型就会自动拆箱。如果null对象引用被自动拆箱,就会得到一个NullPointerException
Long sum=0L;
long startTime=new Date().getTime();
for(long i=0;i<Integer.MAX_VALUE;i++){
sum+=i;
}
long endTime=new Date().getTime();
System.out.println("总时间:"+(endTime-startTime));
//总时间:29079
改成long sum=0L;
//总时间:6724
原因:变量被反复地装箱和拆箱,导致明显的性能下降
什么时候应该使用装箱类型:
1:作为集合中的元素、键和值
2:在参数化类型中,必须使用装箱类型作为类型参数,因为java不允许使用基本类型
3:在进行反射的方法调用时,必须使用装箱基本类型