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+滚轮放大查看即可):

  • 相关阅读:
    228. Summary Ranges
    324. Wiggle Sort II
    42. Trapping Rain Water
    工作之后
    279. Perfect Squares
    391. Perfect Rectangle
    351. Android Unlock Patterns
    246. Strobogrammatic Number
    [LeetCode] 75. Sort Colors Java
    [Java] 80. Remove Duplicates from Sorted Array II Java
  • 原文地址:https://www.cnblogs.com/brucecloud/p/6086009.html
Copyright © 2011-2022 走看看