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

    学习、成长
  • 相关阅读:
    opencv学习笔记汇总(更新中...)
    C语言字符串基础
    python全栈基础
    吴恩达机器学习008神经元和大脑
    吴恩达机器学习004多元梯度下降
    吴恩达机器学习003矩阵和向量
    吴恩达机器学习002线性回归&梯度下降
    吴恩达机器学习001绪论
    吴恩达机器学习007过拟合&&代价函数&&正则化
    手工(命令行)创建RAC
  • 原文地址:https://www.cnblogs.com/yarcl/p/11046770.html
Copyright © 2011-2022 走看看