Heim  >  Fragen und Antworten  >  Hauptteil

Alibaba Java-Entwicklungshandbuch – Komparator

Das Bild oben ist die Beschreibung im „Alibaba Java Development Manual v1.2.0“. Hier ist ein Gegenbeispiel, das besagt, dass die Gleichheitssituation nicht behandelt wird, aber ich denke:

o1.getId() > o2.getId()

Ist es nicht umgekehrt?

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

Ich benutze es normalerweise so. Könnten Sie mir bitte helfen, die Technik dieses Ortes zu erklären? was ist der Grund?

PHPzPHPz2702 Tage vor948

Antworte allen(3)Ich werde antworten

  • 给我你的怀抱

    给我你的怀抱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肯定是不对的,所以一定要单独处理相等的情况。

    Antwort
    0
  • 黄舟

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

    应该要判断等于0 的情况

    Antwort
    0
  • 世界只因有你

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

    经过@gemoji的讨论终于明白了,总结一下:
    在JDK7以前的版本就像Effective Java里说的那样,Comparator不强制要求实现等于,
    在JDK7之后的版本由于排序改用了TimSort算法,导致Comparator必须实现等于.



    <<Effective Java中文版>>里面有详细的解释,其实这是一个强烈建议,反例这样做其实破坏了equals和比较的传递性
    和对称性

    Antwort
    0
  • StornierenAntwort