第49条:基本类型优先于装箱基本类型
Java的类型 分两种 1 基本类型, 2 引用类型;装箱基本类型属于 引用类型
基本类型和装箱基本类型之间的三个主要区别:
1.基本类型只有值,而装箱基本类型具有与它们的值不同的同一性(两个装箱基本类型可以具有相同的值和不同的同一性)
2.基本类型只有功能完备的值,而每个装箱基本类型除了它对应的基本类型的所有功能值之外,还有个非功能值:null
3.基本类型通常比装箱基本类型更节省空间和时间。
Comparator<Integer> naturalOrder = new Comparator<Integer>() {
public int compare(Integer first, Integer second) {
return first < second ? -1 : (first == second ? 0 : 1);
}
};
如果打印:
naturalOrder.Compare(new Integer(42), new Integer(42));
与期望的结果不同,结果不是期望的0,而是1,表明第一个Integer值大于第二个。
问题出现在哪呢?进行表达式first < second执行计算,它会导致被first和second引用的Integer被实例自动拆箱,即它提取了他们的基本类型。计算机动作要检查产生的第一个int值是否小于第二个。但是假设答案是否定的,下一测试就是执行计算表达式 first = = second,它在两个对象引用上执行同一性比较。如果first和second引用表示同一个int值得不同Integer实例,这个比较操作会返回false,比较器会错误地返回1,对装箱基本类型运用==操作符几乎总是错误的。
修正的方法是添加两个局部变量,保存对应于first和second的基本类型int值 拆箱比较。
Comparator<Integer> naturalOrder = new Comparator<Integer>() {
public int compare(Integer first, Integer second) {
int f = first;
int s = second;
return f < s ? -1 : (f == s ? 0 : 1);
}
};
适合使用装箱基本类型的地方:
1.作为集合中的元素,键和值。
2.在参数化类型中,必须使用装箱基本类型作为类型参数。
3.在进行反射方法调用时,必须使用装箱基本类型。
自动装箱减少了使用装箱基本类型的繁琐性,但是并没有减少它的风险。将Integer和int进行比较,装箱基本类型自动拆箱,如果null对象被自动拆箱,就只能得到NullPointException了。