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);