[ Error 分析] Comparison method violates its general contract!

      public static void main(String[] args) {        
        List<Long> ret = new ArrayList<>();

        int n = 103000;
        for(int i=0;i<n;i++){
          ret.add(new Random().nextLong());
        }

        Collections.sort( ret , new Comparator<Long>(){
            @Override
            public int compare(Long o1, Long o2) {
                  return (int) (o2-o1);
            }
        });
    }

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco; color: #ff2600 }
span.s1 { text-decoration: underline; color: #0433ff }
span.Apple-tab-span { white-space: pre }

Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!

at java.util.TimSort.mergeLo(TimSort.java:777)

at java.util.TimSort.mergeAt(TimSort.java:514)

at java.util.TimSort.mergeCollapse(TimSort.java:441)

at java.util.TimSort.sort(TimSort.java:245)

at java.util.Arrays.sort(Arrays.java:1512)

at java.util.ArrayList.sort(ArrayList.java:1454)

at java.util.Collections.sort(Collections.java:175)

一直以为没有什么问题,大于,小于,等于情况都考虑了。 原来原因是:integer overflow,看下面的例子就明白了。负数-正数=正数

o2:-273192312377492627

o1:3368764997970232313

o2-o1:1167472500

所以,这个compare里面定义的方法不符合compare的约束(传递性,对称性,反对称性)

PS:https://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html#compare(T,%20T)

http://svn.python.org/projects/python/trunk/Objects/listsort.txt

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Monaco }

时间: 2024-11-05 18:49:36

[ Error 分析] Comparison method violates its general contract!的相关文章

Comparison method violates its general contract!

今天一个群里哥们儿碰到一个异常,抛到群里求解答,他的代码如下图: 抛出的异常信息为: Java代码   java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:868) at java.util.TimSort.mergeAt(TimSort.java:485) at java.util.TimSor

Java 异常解决之java.lang.IllegalArgumentException: Comparison method violates its general contract!

Java 异常解决 在你的代码前加一句 System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); 我也不知道什么原理,但是解决了!!!哈哈 Java 异常解决之java.lang.IllegalArgumentException: Comparison method violates its general contract!

java-collections.sort异常Comparison method violates its general contract!

转载:http://www.tuicool.com/articles/MZreyuv 异常信息 java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:868) at java.util.TimSort.mergeAt(TimSort.java:485) at java.util.TimSort.me

android java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题

android  java.lang.IllegalArgumentException: Comparison method violates its general contract! 问题 java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeLo(TimSort.java:743) at java.util.TimSort.

java.lang.IllegalArgumentException: Comparison method violates its general contract!

背景 16号为了统一线上服务器运行环境,将两台服务器的Tomcat6+JDK6升级到Tomcat7+JDK7,本以为很简单的事情,升级后自己验证也没问题,没想到却悲剧了.升级后,过了半小时运营就找过来反馈问题,部分角色无法登陆系统,由于异常日志没有输出,没有找到问题,无奈回滚.今天我们就来说说JDK6升级到JDK7会遇到的坑.本文为了方便搜索,就直接以异常信息作为文章标题了. 复现 回滚后,到beta环境按照线上的权限配置,复现该问题,加上了error日志输出,输出了文章标题的异常,这个异常是在

org.apache.jorphan.util.JMeterException: Error invoking bsh method: eva

使用fastJson来做json解析,出现报错. Assertion failure message: org.apache.jorphan.util.JMeterException: Error invoking bsh method: eval Sourced file: inline evaluation of: ``import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; i . . .

Error invoking SqlProvider method (com.github.abel533.mapper.MapperProvider.dynamicSQL). Cause: java.lang.InstantiationException: com.github.abel533.mapper.MapperProvider

org.apache.ibatis.exceptions.PersistenceException: ### Error querying database.  Cause: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (com.github.abel533.mapper.MapperProvider.dynamicSQL).  Cause: java.lang.Instantiati

请求部署在 IIS7.5 上的 REST 服务的 Put/Post/Delete 操作发生 HTTP Error 405.0 - Method Not Allowed 错误之解决

背景 请求部署在 IIS7.5 上的 REST 服务的 Put/POST/DELETE 操作发生 HTTP Error 405.0 - Method Not Allowed 错误. Issue 解决 在 WebAPI 应用的 Web.config 中加入如下设置: <system.webServer> <modules> <remove name="WebDAVModule" /> </modules> <handlers>

IIS7.5上的REST服务的Put操作发生HTTP Error 405.0 - Method Not Allowed 解决方法

WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在IIS 7.0中,WebDAV是作为独立扩展模块,需要单独进行下载,而IIS 7.5中将集成WebDAV,然而WebDav把Put,Delete给咔嚓了.所以在IIS 7.5上部署的RESTful服务(WCF Data Service,WCF Rest Service,ASP.NET Web API,