java.lang.IllegalArgumentException: Comparison method violates its general contract!

使用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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章