zoukankan      html  css  js  c++  java
  • TimSort in Java 8

    在项目中使用了Collections.sort(list, comparator)对集合进行了排序,偶然间遇到异常IllegalArgumentException: "Comparison method violates its general contract!"

    而这个异常是在Java 7中加入的,因而使用Java 7之前的环境是没问题的。

    导致这个异常的原因是comparator的compare()中的比较条件写的不规范导致的,因为从Java 7开始Arrays的默认排序从之前的MergeSort改成了TimSort。

    在看了Java 8中的TimSort代码实现后,写了个案例,重现了异常IllegalArgumentException: "Comparison method violates its general contract!"

    先看下Comparator的compare()方法的使用规范:

    根据上面的规范,案例如下所示:

    错误的Comparator代码如下:

    正确的代码如下:

    在Arrays类中的sort方法有一个分支判断,当LegacyMergeSort.userRequested为true的情况下,采用legacyMergeSort,否则采用TimSort。

    并且在legacyMergeSort的注释上标明了该方法会在以后的jdk版本中废弃,因此以后Arrays类中的sort方法将采用TimSort。关键部分代码如下图:

    Java 8中的TimSort代码如下(图片看不清,使用Ctrl+滚轮放大查看即可):

  • 相关阅读:
    ecos之widget
    一个php小白找工作的历程
    php知识点总结(待续)
    2
    php笔试题1
    兄弟连面试宝典php
    第二十一章 消费者选择理论
    第二十章 收入不平等与贫困
    第十九章 收入与歧视
    第十八章 生产要素市场
  • 原文地址:https://www.cnblogs.com/brucecloud/p/6086009.html
Copyright © 2011-2022 走看看