排序中遇到的一个溢出问题

排序中出现的一个溢出问题

前几天一个榜单业务出现了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类型做排序依据,避免出现奇奇怪怪的问题。

posted @ 2018-12-20 20:05  石头山  阅读(229)  评论(0)    收藏  举报