`
sam406
  • 浏览: 57817 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多
第五条  基本类型优先于装箱基本类型
  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 中文版》
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics