打字猴:1.700440508e+09
1700440508 编写高质量代码:改善Java程序的151个建议 [:1700438095]
1700440509 编写高质量代码:改善Java程序的151个建议 建议27:谨慎包装类型的大小比较
1700440510
1700440511 基本类型是可以比较大小的,其所对应的包装类型都实现了Comparable接口也说明了此问题,那我们来比较一下两个包装类型的大小,代码如下:
1700440512
1700440513 public class Client{
1700440514
1700440515 public static void main(String[]args){
1700440516
1700440517 Integer i=new Integer(100);
1700440518
1700440519 Integer j=new Integer(100);
1700440520
1700440521 compare(i, j);
1700440522
1700440523 }
1700440524
1700440525 //比较两个包装对象大小
1700440526
1700440527 public static void compare(Integer i, Integer j){
1700440528
1700440529 System.out.println(i==j);
1700440530
1700440531 System.out.println(i>j);
1700440532
1700440533 System.out.println(i<j);
1700440534
1700440535 }
1700440536
1700440537 }
1700440538
1700440539 代码很简单,产生了两个Integer对象,然后比较两者的大小关系,既然基本类型和包装类型是可以自由转换的,那上面的代码是不是就可打印出两个相等的值呢?让事实说话,运行结果如下:
1700440540
1700440541 false
1700440542
1700440543 false
1700440544
1700440545 false
1700440546
1700440547 竟然是3个false,也就是说两个值之间不等,也没大小关系,这也太奇怪了吧。不奇怪,我们来一一解释。
1700440548
1700440549 i==j
1700440550
1700440551 在Java中“==”是用来判断两个操作数是否有相等关系的,如果是基本类型则判断值是否相等,如果是对象则判断是否是一个对象的两个引用,也就是地址是否相等,这里很明显是两个对象,两个地址,不可能相等。
1700440552
1700440553 i>j和i<j
1700440554
1700440555 在Java中,“>”和“<”用来判断两个数字类型的大小关系,注意只能是数字型的判断,对于Integer包装类型,是根据其intValue()方法的返回值(也就是其相应的基本类型)进行比较的(其他包装类型是根据相应的value值来比较的,如doubleValue、floatValue等),那很显然,两者不可能有大小关系的。
1700440556
1700440557 问题清楚了,修改总是比较容易的,直接使用Integer实例的compareTo方法即可。但是这类问题的产生更应该说是习惯问题,只要是两个对象之间的比较就应该采用相应的方法,而不是通过Java的默认机制来处理,除非你确定对此非常了解。
[ 上一页 ]  [ :1.700440508e+09 ]  [ 下一页 ]