Comparison method violates its general contract!

  廢話少說,直接上報錯信息(以下圖)java

  最近公司app上有個列表時而報錯,時而不報,復現問題不是很容易,翻看了下日誌才知道是排序的地方有問題,這仍是我第一次遇到,具體定位:Collections.sort(xxx),算法

因而再看對應的compareTo方法,以下app

 

1     @Override
2     public int compareTo(xxx o) {
3         return this.getPublishTime().getTime() < o.getPublishTime().getTime() ? 1 : -1;
4     }

 

咋一看,這個倒序排列就是沒有對==的狀況進行處理,而是將==算做-1處理了,Google了一下,發現是因爲jdk7排序換了新的算法Timsort,這樣就會對排序的大小進行嚴格校驗,而jdk6是沒有對此進行校驗的ide

因此解決方法就簡單了,直接對==的狀況加下處理便可。另外網上也提供了指定使用排序算法的解決方案(添加JVM參數:-Djava.util.Arrays.useLegacyMergeSort=true ),這個我沒有試驗this

相關文章
相關標籤/搜索