阿里巴巴Java開發手冊—Comparator
PHPz
PHPz 2017-05-27 17:40:39
0
3
982

#上圖是《阿里巴巴Java開發手冊v1.2.0》中的說明,這裡舉了個反例,說沒有處理相等的情況,但我想:

o1.getId() > o2.getId()

反過來不就是

o1.getId() <= o2.getId()

我平常都是這樣用的,求大神在幫忙解釋這個地方的技巧是什麼?是什麼原因?

PHPz
PHPz

学习是最好的投资!

全部回覆(3)
给我你的怀抱

進一步了解了一下,問題的根本原因是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和比較的傳遞性
和對稱性

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板