错误案例
【现象描述】
两个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]