使用Collections.sort排序List時出現如下異常:
主要錯誤:java.lang.IllegalArgumentException: Comparison method violates its general contract!
JDK版本1.8。
經過搜索得知,在JDK7以後,實現Comparable接口後,要滿足一下三個特性:
1) 自反性:x,y 的比較結果和 y,x 的比較結果相反。
2) 傳遞性:x>y,y>z,則 x>z。
3) 對稱性:x=y,則 x,z 比較結果和 y,z 比較結果相同。
報錯代碼中不滿足對稱性。
這一點是JDK6和JDK7+以上不兼容的點。
在JDK8中,使用了一個if判斷來決定使用什麼排序算法來對數組進行排序,不設置就使用ComparableTimSort實現的TimSort算法來進行排序:
解決方法:
1、在代碼中添加 :System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
或者設置JVM參數-Djava.util.Arrays.useLegacyMergeSort=true來兼容JDK6的代碼;
2、完善上述代碼,滿足對稱性,即:
if (this.id == null && obj.id == null) {
return 0;
}
if (this.id == null) {
return 1;
}
if (obj.id == null) {
return -1;
}