compareto 排序异常记录

记录一次 compareto使用异常  java.lang.IllegalArgumentException: Comparison method violates its general contract!

源代码 如下 刚开始执行运行都没有任何问题,上线后运行了一段时间也很平稳,但是在一次排查问题时发现这样一个报错,感觉很奇怪。根据日志定位报错的代码如下(感觉好像也没有什么问题)

@Override
public int compare(Integer o1, Integer o2) {
    return o1.intValue()>o2.intValue()?1:-1;
}

刚看到这个地方报错时一头雾水 ,自己怎么测试也没有问题,后来百度发现看到博客上有一个例子,运行会报错,才开始认真的看待这个问题;

其实问题并不难理解,只是不够严谨;在jdk1.6时忽略这个异常 而1.8并没有忽略这个问题,如果违反了约束条件就会抛出llegalArgumentException异常;

而该方法报错违法的是 可传递性约束 

 比如: a>b, b>c  则 a>c 一定成立  , 当a=b时  b=c ,a=c 也一定成立

如果仅仅 返回1和-1 在算法上并不严谨

比如 当 a>b时  那么 compare(a,b)=1成立 ,对应的compare(b,a)=-1也成立 , 即   compare(a,b)= -(compare(b,a))

如果 a=b  那么 compare(a,b)=-1 而 compare(b,a)=-1 因此   compare(a,b)= -(compare(b,a))不成立 ;

所以正确的写法是补充返回0的情况

@Override
            public int compare(Integer o1, Integer o2) {
                return o1.intValue() > o2.intValue() ? 1 : o1.intValue() == o2.intValue()?0:-1;
            }

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值