記錄在 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); } });