记录在 JDK7 下使用 Collections.sort() 排序偶发的一个异常,之前在 JDK1.6 下面没有这个问题:java
Comparison method violates its general contractide
发生问题的代码段:spa
Collections.sort(resultsData, new Comparator<RecordLog>(){ @Override public int compare(RecordLog log1, RecordLog log2) { return log1.getTrust() >= log2.getTrust() ? -1 : 1; } });
一个很简单的排序,在JDK1.6下运行没有任何问题,可是切换到JDK7下面偶然会抛出了错误:code
java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(Unknown Source) at java.util.TimSort.mergeAt(Unknown Source) at java.util.TimSort.mergeCollapse(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.TimSort.sort(Unknown Source) at java.util.Arrays.sort(Unknown Source) at java.util.Collections.sort(Unknown Source)
缘由是:JDK7中的Collections.sort()方法实现中采用 TimeSort,若是两个值是相等的,那么compare方法须要返回0,不然可能会在排序时抛错,而JDK6是没有这个限制的。blog
解决方法就很简单了:排序
Collections.sort(resultsData, new Comparator<RecordLog>(){ @Override public int compare(RecordLog log1, RecordLog log2) { return log1.getTrust() == log2.getTrust() ? 0 : (log1.getTrust() > log2.getTrust() ? -1 : 1); } });