好好学Java:从零基础到项目实战
上QQ阅读APP看书,第一时间看更新

4.2.2 包装变量的运算

对于数值包装变量来说,它们仍旧允许使用四则运算符执行计算操作,包括运算符“+”“-”“*”“/”“%”等。然而若要判断两个包装变量的数值是否相等,便不可通过双等号“==”来判断,而要调用包装变量的equals方法来校验。equals方法返回true表示待比较的两个包装变量值相等,返回false表示两个数值不等。调用equals方法的代码示例如下:

        Integer oneInteger=1;
        boolean equalResult=oneInteger.equals(2);  // 包装变量的equals方法相当于关系运算符“==”
        System.out.println("equalResult="+equalResult);

为什么包装变量之间不能通过“==”比较是否相等呢?这是因为数值包装类型不单单保存数值,还保存了各种方法信息。如果对两个包装变量使用运算符“==”,程序只会比较两个变量是否为同一个东西,不会比较它们的数值是否相等。欲知究竟为何,且看下面的代码(完整代码见本章源码的src\com\method\pack\PackOperation.java):

        Integer ten1=10, ten2=10;  //准备演示两个包装变量之间的==运算
        boolean equalTen=(ten1==ten2);  //当变量值小于128时,==运算侥幸得手
        System.out.println("equalTen="+equalTen);
        Integer thousand1=1000, thousand2=1000;  //准备演示两个包装变量之间的==运算
        boolean equalThousand=(thousand1==thousand2);  //当变量值大于128时,==运算不幸失手
        System.out.println("equalThousand="+equalThousand);

上面的代码准备比较两个值为10的包装变量是否相等,以及两个值为1000的包装变量是否相等。运行这段测试代码,输出以下的日志信息:

equalTen=true

equalThousand=false

由日志可见,采用运算符“==”比较的话,两个值为10的包装变量判作相等,而两个值为1000的包装变量却判作不等。其实不等的判断结果才是正常的,因为相等的判断结果只在数值小于128时出现。当包装变量的数值小于128时,程序会复用内存中已有的包装变量,否则将另外创建新的包装变量。所以切不可把特例当作惯例,若要比较两个包装变量的数值是否相等,务必通过equals方法比较才行。

除了基本的类型转换与数值运算之外,包装类型还提供了其他几种常见的逻辑方法,比如sum方法用来求两个数字之和,max方法用来求两个数字的较大值,min方法用来求两个数字的较小值。另有compare方法用来比较两个数字的大小:若二者相等,则返回0;前者较小,则返回-1;若后者较小,则返回1。这几个方法的调用代码例子如下:

        int a=7, b=8;
        int sum=Integer.sum(a, b);  // 数值包装类型的sum方法相当于算术运算符“+”
        System.out.println("sum="+sum);
        int max=Integer.max(a, b);  // 数值包装类型的max方法用来求两个数字的较大值
        System.out.println("max="+max);
        int min=Integer.min(a, b);  // 数值包装类型的min方法用来求两个数字的较小值
        System.out.println("min="+min);
        // 数值包装类型的compare方法用来比较两个数字的大小,
        // 若二者相等,则返回0;前者较小,则返回-1;若后者较小,则返回1
        int compareResult=Integer.compare(a, b);
        System.out.println("compareResult="+compareResult);