搜尋

首頁  >  問答  >  主體

阿里巴巴Java開發手冊—Comparator

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

o1.getId() > o2.getId()

反過來不就是

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

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

PHPzPHPz2769 天前1026

全部回覆(3)我來回復

  • 给我你的怀抱

    给我你的怀抱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肯定是不對的,所以一定要單獨處理相等的情況。

    回覆
    0
  • 黄舟

    黄舟2017-05-27 17:42:39

    應該要判斷等於0 的情況

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-27 17:42:39

    經過@gemoji的討論終於明白了,總結一下:
    在JDK7以前的版本就像Effective Java裡說的那樣,Comparator不強制要求實現等於,
    在JDK7之後的版本由於排序改用了TimSort演算法,導致Comparator必須實作等於.



    <>裡面有詳細的解釋,其實這是一個強烈建議,反例這樣做其實破壞了equals和比較的傳遞性
    和對稱性

    回覆
    0
  • 取消回覆