Comparison method violates its general contract! 异常原因

项目运行期间出现Comparison method violates its general contract!异常,网上查阅了一下,原因还是比较明确的:

Collections.sort(list, new Comparator<Integer>() {  
    @Override  
    public int compare(Integer o1, Integer o2) {  
        return o1 > o2 ? 1 : -1;// 错误的方式  
    }  
});  

查看代码写的本身是问题的,第4行没有考虑o1 == o2的情况,

这样在JDK6中运行是没有问题,但是在JDK7中就可能会出现上述异常。

原因是:这是因为JDK7底层的排序算法换了,而新的算法必须满足如下约束条件:

  • sgn(compare(x, y)) == -sgn(compare(y, x))
  • ((compare(x, y)>0) && (compare(y, z)>0)) implies compare(x, z)>0
  • compare(x, y)==0 implies that sgn(compare(x, z))==sgn(compare(y, z)) for all z

简单点说,就是必须指明相等的情况下返回 0.

感谢大神,查看的CSDN博客原文如下:

Comparison method violates its general contract!

原文地址:https://www.cnblogs.com/LionheartCGJ/p/7754437.html