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”);

posted @ 2018-04-19 17:45  yarcl  阅读(192)  评论(0编辑  收藏  举报