zoukankan      html  css  js  c++  java
  • JDK1.7与JDK1.6当中Collections的TimSort排序的不兼容复现

    jdk1.7报错java.lang.IllegalArgumentException: Comparison method violates its general contract!
    由于本人在复现这个问题的时候找了好久,故在这里记录下来这个问题,以便其他朋友们直接发现问题所在。想看TimSort算法(JDK1.7的排序算法),可以参考https://blog.csdn.net/yangzhongblog/article/details/8184707
    首先废话不多说,直接先上代码:
    import java.util.*;

    public class HelloWorld {

    public static void main(String[] args) throws Exception {
    
        List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
        Long[] a = {
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
                1523883432000L, 1523883432001L, 1523883432003L, 1523883432003L, 1523883432005L, 1523883432005L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432010L, 1523883432011L, 1523883432011L, 1523883432013L,
                1523883432005L, 1523883432006L, 1523883432007L, 1523883432008L, 1523883432012L, 1523883432013L, 1523883432014L, 1523883432020L,
        };
        for(int i=0; i<a.length; i++) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("time", a[i]);
            listMap.add(map);
        }
    
        //System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
        Collections.sort(listMap, new Comparator<Map<String, Object>>() {
            @Override
            public int compare(Map<String, Object> o1, Map<String, Object> o2) {
                Long time1 = Long.parseLong(o1.get("time").toString());
                Long time2 = Long.parseLong(o2.get("time").toString());
                /*return time1 >= time2  ? 0 : (time1 > time2 ? 1 : -1);*/
                if (time1 >= time2) {
                    return 1;
                } else {
                    return -1;
                }
            }
        });
    }
    

    }

    这段代码如果在jdk1.6的版本下进行测试,是不会有任何问题的。如下图:
    这里写图片描述

    但是如果我们使用jdk1.7的版本进行编译执行,如下图所示:
    这里写图片描述

    个人觉得这应该是jdk1.7的Bug,毕竟1.6的jdk并没有出现问题。而且如果你将上面的数组数据设置少一些的话,那么这个错误也并不会出现,如下图所示:
    这里写图片描述
    代码为:
    这里写图片描述
    所以我觉得应该是jdk的Bug。
    解决方案就是不使用JDK1.7的排序,代码就是在排序之前添加如下代码:
    System.setProperty(“java.util.Arrays.useLegacyMergeSort”, “true”);

    学习、成长
  • 相关阅读:
    Codevs 2597 团伙(并查集)
    Codevs 1074 食物链 2001年NOI全国竞赛
    Bzoj 3831 [Poi2014]Little Bird
    Codevs 4600 [NOI2015]程序自动分析
    Codevs 3287 货车运输 2013年NOIP全国联赛提高组(带权LCA+并查集+最大生成树)
    段落排版--中文字间距、字母间距
    段落排版--行间距(行高)
    段落排版--缩进
    文字排版--删除线
    文字排版--下划线
  • 原文地址:https://www.cnblogs.com/yarcl/p/11046770.html
Copyright © 2011-2022 走看看