#上圖是《阿里巴巴Java開發手冊v1.2.0》中的說明,這裡舉了個反例,說沒有處理相等的情況,但我想:
o1.getId() > o2.getId()
反過來不就是
o1.getId() <= o2.getId()
我平常都是這樣用的,求大神在幫忙解釋這個地方的技巧是什麼?是什麼原因?
学习是最好的投资!
進一步了解了一下,問題的根本原因是JDK7的排序實作改為了TimSort,詳細見這篇文章。 http://blog.2baxb.me/archives...
一開始回答的時候並沒有完全理解作者問問題的意圖,回答得有點草率,為此道個歉。 分割線下是先前回答的內容,因為答案評論裡有和@wanghaa 就舊有答案的討論,因此保留,也謝謝@wanghaa 讓我意識到問題。
public static void main(String[] args) { int i = 1; int j = 1; int ret = i > j ? 1 : -1; System.out.println(ret); }
上面的程式碼會輸出-1,進行比較的兩個取值相等的情況下應該回傳0,回傳-1肯定是不對的,所以一定要單獨處理相等的情況。
應該要判斷等於0 的情況
經過@gemoji的討論終於明白了,總結一下:在JDK7以前的版本就像Effective Java裡說的那樣,Comparator不強制要求實現等於,在JDK7之後的版本由於排序改用了TimSort演算法,導致Comparator必須實作等於.
>裡面有詳細的解釋,其實這是一個強烈建議,反例這樣做其實破壞了equals和比較的傳遞性和對稱性
進一步了解了一下,問題的根本原因是JDK7的排序實作改為了TimSort,詳細見這篇文章。
http://blog.2baxb.me/archives...
一開始回答的時候並沒有完全理解作者問問題的意圖,回答得有點草率,為此道個歉。
分割線下是先前回答的內容,因為答案評論裡有和@wanghaa 就舊有答案的討論,因此保留,也謝謝@wanghaa 讓我意識到問題。
上面的程式碼會輸出-1,進行比較的兩個取值相等的情況下應該回傳0,回傳-1肯定是不對的,所以一定要單獨處理相等的情況。
應該要判斷等於0 的情況
經過@gemoji的討論終於明白了,總結一下:
在JDK7以前的版本就像Effective Java裡說的那樣,Comparator不強制要求實現等於,
在JDK7之後的版本由於排序改用了TimSort演算法,導致Comparator必須實作等於.
>裡面有詳細的解釋,其實這是一個強烈建議,反例這樣做其實破壞了equals和比較的傳遞性
和對稱性