java-collections.sort異常Comparison method violates its general contract!

異常信息

java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeHi(TimSort.java:868)

? at java.util.TimSort.mergeAt(TimSort.java:485)

? at java.util.TimSort.mergeCollapse(TimSort.java:408)

at java.util.TimSort.sort(TimSort.java:214)

? at java.util.TimSort.sort(TimSort.java:173)

? at java.util.Arrays.sort(Arrays.java:659)

? at java.util.Collections.sort(Collections.java:217)

...


原因

JDK7中的Collections.Sort方法實現中,如果兩個值是相等的,那么compare方法需要返回0,否則可能會在排序時拋錯,而JDK6是沒有這個限制的。

if(len2 == 0) {

? ? thrownewIllegalArgumentException("Comparison method violates its general contract!");

}


?在 JDK7 版本以上,Comparator 要滿足自反性,傳遞性,對稱性,不然 Arrays.sort,

Collections.sort 會報 IllegalArgumentException 異常。

說明:

1) 自反性:x,y 的比較結果和 y,x 的比較結果相反。

2) 傳遞性:x>y,y>z,則 x>z。

3) 對稱性:x=y,則 x,z 比較結果和 y,z 比較結果相同。

反例:下例中沒有處理相等的情況,實際使用中可能會出現異常:

newComparator() {

? ? @Override? ? publicint compare(Student o1, Student o2) {? ? ? ?

?????????????returno1.getId() > o2.getId() ? 1 : -1;

? ? }

}


知識只有共享才能傳播,才能推崇出新的知識,才能學到更多,這里寫的每一篇文字/博客,基本都是從網上查詢了一下資料然后記錄下來,也有些是原滋原味搬了過來,也有時加了一些自己的想法

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容