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

原文地址:https://www.cnblogs.com/brucecloud/p/6086009.html