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