为什么比较器声明等于?

时间:2012-06-13 11:25:20

标签: java lambda java-8 comparator functional-interface

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

8 个答案:

答案 0 :(得分:10)

Comparator改进了Object.equals的合同:它必须满足Object.equals 所设置的约束。

  

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

equals内声明Comparator允许您以javadoc的形式记录此内容。

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

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

答案 1 :(得分:4)

来自Java documentationsComparator拥有自己的equals()方法的原因是:

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

答案 2 :(得分:4)

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

  

请注意,不要覆盖Object.equals(Object)

总是安全的

大多数情况下,您不会覆盖比较器中的equals()

答案 3 :(得分:1)

来自docs

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

equals()中的Comparator方法用于强制实施Comparator接口的用户实施equals(),除了已应用的规则和约束之外还有一些额外的规则和约束来自equals()的{​​{1}}。

附加规则是:

  

此方法必须遵守 Object.equals(Object)的一般合约。   此外,此方法只有在指定的对象时才能返回true   也是一个比较器,它的排序与此相同   比较。因此, comp1.equals(comp2)意味着   每个 sgn(comp1.compare(o1,o2))== sgn(comp2.compare(o1,o2))   对象引用 o1 o2

答案 6 :(得分:0)

将Object方法放在接口声明中允许使用Javadoc 意义相等的声明必须具有类别 实现界面。

答案 7 :(得分:0)

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类继承的equals()方法实现仅检查两个referance是否指向同一个对象。它不适用于任何比较。你将在你的班级(或可能在你的界面中)提供对象相等的标准。

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

显然,每当你实现对象少的时候,比你在相同时必须实现的要大。因此,您应该提供逻辑以检查相等性

,而不是依赖于默认的Object equals()方法