两个对象比较大小时出现的问题

错误案例

【现象描述】

两个Integer类型的数据,进行大小比较,发现无法进行正确的比较

【错误代码】

  Comparator<Integer> c = new Comparator<Integer>() {
    public int compare(Integer i1, Integer i2) {
      return i1 - i2;// 升序
    }
  };
  List<Integer> l = new ArrayList<Integer>();
  l.add(new Integer(-2000000000));
  l.add(new Integer(2000000000));
  Collections.sort(l, c);
  System.out.println(l);
  // [打印出来的结果:2000000000, -2000000000]

错误分析

先看看下面程序片断:

int x = -2000000000;
int y = 2000000000;
/*
 * -2000000000 即 -(01110111001101011001010000000000)
 * 的补码为:                10001000110010100110110000000000
 * 
 * 计算过程使用竖式表示:
 * 10001000110010100110110000000000
 * 10001000110010100110110000000000
 * --------------------------------
 * 00010001100101001101100000000000
 * 
 * 计算结果溢出,结果为294967296
 */
System.out.println(x - y);// 294967296

short, int, long减法和加法都可能出现数值溢出

正确用法

基于整型的比较器的实现一般使用如下的方式来比较:

Comparator<Integer> c = new Comparator<Integer>() {
  public int compare(Integer i1, Integer i2) {
    return (i1 < i2 ? -1 : (i1 == i2 ? 0 : 1));
  }
};
List<Integer> l = new ArrayList<Integer>();
l.add(new Integer(-2000000000));
l.add(new Integer(2000000000));
Collections.sort(l, c);
System.out.println(l);
// [打印出来的结果:-2000000000, 2000000000]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值