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

错误案例

【现象描述】

两个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]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章