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方法實(shí)現(xiàn)中,如果兩個(gè)值是相等的,那么compare方法需要返回0,否則可能會(huì)在排序時(shí)拋錯(cuò),而JDK6是沒有這個(gè)限制的。

if(len2 == 0) {

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

}


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

Collections.sort 會(huì)報(bào) IllegalArgumentException 異常。

說明:

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

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

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

反例:下例中沒有處理相等的情況,實(shí)際使用中可能會(huì)出現(xiàn)異常:

newComparator() {

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

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

? ? }

}


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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容