在基本类型和装箱基本类型之间有三个主要区别:
1、基本类型只有值,而装箱基本类型则具有与他们不同的同一性。换句话说,两个装箱基本类型可以具有相同的值和不同的的同一性。
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。 对装箱类型运用==操作符几乎总是错误的。
2、基本类型只有功能完备的值,而每个装箱基本类型除了他对应基本类型的所有功能值之外,还有个非功能值:null。
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。
3、基本类型通常比装箱基本类型更节省时间和空间。
什么时候应该使用装箱类型:
- 作为集合中的元素、键和值
- 在参数化类型中,必须使用装箱类型作为类型参数,因为java不允许使用基本类型
- 在进行反射的方法调用时,必须使用装箱基本类型