排序中遇到的一个溢出问题
排序中出现的一个溢出问题
前几天一个榜单业务出现了bug,经检查发现排序过程中出现了问题。
public class Bean implements Comparable<Bean> {
/**
* 其中的一项排序依据
*/
private int index;
public Bean(int index) {
this.index = index;
}
@Override
public int compareTo(Bean o) {
//这里有问题
return index - o.index;
}
@Override
public String toString() {
return "Bean{" +
"index=" + index +
'}';
}
public static void main(String[] args) {
ArrayList<Bean> beanList = new ArrayList<Bean>(){{
add(new Bean(5));
add(new Bean(1));
}};
Collections.sort(beanList);
System.out.println(beanList);
}
}
上面这个示例中,一般情况下没有问题,但当排序依据接近类型上下界时,会发生减法溢出,所以最好用对应类型 的静态比较方法处理:
@Override
public int compareTo(Bean o) {
return Integer.compare(index,o.index);
}
这样就不会发生溢出了。
Integer、Long、Double的compareTo()方法实现不同,具体可以见源码,另外,最好不要用Double类型做排序依据,避免出现奇奇怪怪的问题。

浙公网安备 33010602011771号