错误案例
【现象描述】
两个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]
本文讨论了整型比较中出现的数值溢出问题,并通过实例展示了正确的比较器实现方式,确保整数范围内的正确排序。
1949

被折叠的 条评论
为什么被折叠?



