读书笔记effective java 之通用程序设计3

第五条 基本类型优先于装箱基本类型
java有一个类型系统由两部分组成,包含基本类型(如int,double,long,boolean)和引用类型(如String,List),每一个基本类型都有一个对应的引用类型,称作装箱基本类型。基本类型和装箱类型有3个区别:
1:基本类型只有值,而装箱基本类型则具有与它们的值不同的同一性。
2:基本类型只有功能完备的值,而每个装箱基本类型除了它对应基本类型的所有值功能之
外,还有个非功能值:null。
3:基本类型通常比装箱基本类型更节省时间和空间。
看下面实例
 Comparator<Integer>   order=new Comparator<Integer>(){
public int comparator(Integer first,Integer second){
return first<second?-1:(first==second?0:1)
}
}

这个比较器看似不错。但是在输入order.Compare(new Integer(11),new Integer(11)),这

个比较下意识认为是0,然而输出结果是1,这表明一个大于第二个数。问题出在那了?
在对first<second执行计算会导致被first和second引用的Integer实例被自动拆箱,也就是说,它提取了它们的基本类型值,计算动作要检查产生的第一个int值是否小于第二个。但是假设答案是否定的。下一个测试就是执行计算表达式first==second,它在两个对象引用上执行同一比较。如果first 和second引用表示用一个int值的不同的Integer实例。这个比较操作就会返回false,比较器会错误的返回1.表示第一个Integer值大于第二个。对装箱基本类型运用==操作符几乎是错误的。
修正这个问题就是添加两个局部变量,来保存两个比较值。

Comparator<Integer>   order=new Comparator<Integer>(){
public int comparator(Integer first,Integer second){
int i=first;
int j=second;
return i<j?-1:(i==j?0:1)
}
}

接下来。在看个程序
  public class Unbelievable{
static Integer i;
public static void main(String [] args){
if(i==42){
System.out.println("Unblievable");
}
}
}

在执行时(i==42)会抛出NullPointerException异常,问题在于,i是一个Integer,而不是int,就像所有对象的引用域一样,它的初始值null,在一项操作中混合使用基本类型和装箱类型时,装箱基本类型就会自动拆箱,此时Nul对象引用被自动拆箱,就会得到一个nullPointException异常。
在选择类型时应该是基本类型优先于装箱基本类型。当程序用==操作符比较两个装箱基本类型时,它做了个同一性比较,在程序进行涉及装箱和拆箱基本类型的混合类型计算时,它会进行拆箱,当程序进行拆箱时,会抛出NullPointerException。最后,当程序装箱了基本类型值时,会导致高开销和不必要的对象创建。

注:本文出自《effective java 中文版》
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值