为什么比较器声明等于?

Comparator接口有自己的equals()方法。 默认情况下,任何类都将通过Object类获得equals() 。 在接口中有什么需要equals()方法?

Comparator改进了Object.equals的契约:它必须满足Object.equals设置的约束,然后才能满足一些约束。

此外,仅当指定的对象也是比较器并且它与此比较器施加相同的顺序时,此方法才能返回true。 因此, comp1.equals(comp2)意味着每个对象引用o1o2 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))

Comparator声明一个equals允许您以javadoc的forms记录它。

请注意,API的文档也可作为合同,因此这里不仅仅是化妆品。 这是其他代码和代码可以依赖的明确约束。

在类似情况下,您的方法较少,它也可以用作记录意图。 即, Interface.method应该在那里,无论其超级接口如何发展。

从Java 文档中 , Comparator拥有它自己的equals()方法的原因是:

但是,在某些情况下,通过允许程序确定两个不同的比较器强加相同的顺序,覆盖此方法可以提高性能

阅读它的javadoc 。 它只是解释了如果你选择在实现Comparator的类中覆盖它, equals()必须返回什么。 您可能认为没有比较器可以与任何其他比较器相等,但事实并非如此。 如果两个比较器为任何参数返回相同的东西,你可能会认为两个比较器是相等的,但实际情况并非如此。 javadoc解释说,如果两个比较器强加相同的排序,则无论给出的参数如何,它们都是相等的。 javadoc还说:

请注意,不要覆盖Object.equals(Object)总是安全的

大多数情况下,您不会在比较器中重写equals()

来自文档 :

不要覆盖Object.equals(Object)总是安全的。 但是, 在某些情况下,通过允许程序确定两个不同的比较器强加相同的顺序覆盖此方法可以提高性能

从技术上讲,该方法的声明是多余的(编译器不关心),但……

在此接口中声明equals方法使其成为调用者和不同Comparators之间的契约的一部分,并允许它指定/扩展其语义。

它指定两个比较器只有在使用compare()方法强加相同的顺序时才相等。 这扩展了Object.equals()的语义,因此必须在接口中进行记录。

提供Comparatorequals()方法是为了强制实现Comparator接口的用户除了已经在Object equals()上应用的规则和约束之外,还使用一些额外的规则和约束来实现equals()

附加规则是:

此方法必须遵守Object.equals(Object)常规协定 。 此外,仅当指定的对象也是比较器并且它与此比较器施加相同的顺序时,此方法才能返回true。 因此, comp1.equals(comp2)意味着每个对象引用o1o2的 sgn(comp1.compare(o1,o2))== sgn(comp2.compare(o1,o2))

将Object方法放在接口声明中允许在实现接口的类中具有等于含义的Javadoc声明。

 Comparator interface have their own equals() method 

好,。 首先,应该清楚的是,每当您实现Comparable接口时,您应该提供程序来决定何时对象相等,更少或更多。

 I am quite confuse about have equals() inside Comparator. Any class will get equals() by default through Object class. 

从Object类inheritance的equals()方法实现仅检查两个referance是否指向同一个对象。 它不适用于任何比较。 您将在您的class级(或可能在您的界面中)提供对象相等的标准。

 Then what is need to have equals() method inside an interface? 

显然,无论何时实现对象较少时,都要比它们在相等时必须实现的要大。 因此,您应该提供逻辑来检查相等性,而不是依赖于默认的Object equals()方法