#上圖是《阿里巴巴Java開發手冊v1.2.0》中的說明,這裡舉了個反例,說沒有處理相等的情況,但我想:
o1.getId() > o2.getId()
反過來不就是
o1.getId() <= o2.getId()
我平常都是這樣用的,求大神在幫忙解釋這個地方的技巧是什麼?是什麼原因?
给我你的怀抱2017-05-27 17:42:39
進一步了解了一下,問題的根本原因是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肯定是不對的,所以一定要單獨處理相等的情況。
世界只因有你2017-05-27 17:42:39
經過@gemoji的討論終於明白了,總結一下:
在JDK7以前的版本就像Effective Java裡說的那樣,Comparator不強制要求實現等於,
在JDK7之後的版本由於排序改用了TimSort演算法,導致Comparator必須實作等於.
<
和對稱性