为什么equals()是Comparator而不是Java中的Comparable接口

在Comparator接口中有equals()方法,但它在Comparable接口中不存在。 为什么? 此外,根据equals()和hashcode()之间的契约,两者都必须被覆盖,而在Comparator中则不是这样。 为什么? 任何人都可以帮助我理解它背后的概念。

在Comparator接口中有equals()方法,但它在Comparable接口中不存在。 为什么?

Comparator.equals(…)用于测试对象是否等于此比较器 ; 它不是用于测试两个可比较的对象是否相等。 (这就是它需要单个Object而不是两个T 。)因为Comparator声明它,并不意味着Comparable有任何理由声明它。

也就是说,仍然值得问为什么比较器声明它,因为比较器(像每种类型)已经是Object的子类型。 原因很简单,Comparator想要对equals(…)施加一些额外的要求,因此它需要提供特定的Javadoc。 (具体来说,它要求两个比较器永远不会被认为是相等的,除非它们实现相同的顺序。比较器的实现可以通过使用Object中的equals(…)或通过定义自定义等于(…)来满足此要求。那更精确。)

此外,根据equals()和hashcode()之间的契约,两者都必须被覆盖,而在Comparator中则不是这样。

比较器实际上并不“覆盖”等于(…)。 Comparator的实现者仍然inheritanceObject.equals(…),除非它们覆盖它。

由于Comparator没有提供equals()的实际实现 – 它只是指定了一些额外的要求 – 它不需要对hashCode()说任何特别的东西。 hashCode()的一般契约以及hashCode()与equals()的关系仍然适用。

实现Comparable的类已经有一个从Objectinheritance的equals方法,而Comparable对equals()没有额外的约束。

比较器要求,对于MyComparatorType.equals(Comparator other)返回true,我的比较器和另一个比较器都采用相同的顺序。 这允许一些性能改进和优化,并且如果违反此特殊合同,可能会在某些时候导致运行时exception。

来自比较器javadoc的相关行:

指示某个其他对象是否“等于”此比较器。 此方法必须遵守Object.equals(Object)的常规协定。

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

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

因此,Comparator 遵循与实现Object.equals(Object)的任何其他事物相同的合同,其中包括正确的hashCode()行为。

equals(Object obj)存在于所有类中。 它来自Object类。

Comparator接口中,添加了equals(Object obj)声明以覆盖相关的javadoc,以便客户端知道有意覆盖此类的 equals()方法。 这是一个提示。

比较器中的equals(Object obj) Javadoc:

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

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

有什么意义? 想象你必须用不同的比较器多次调用Collections.sort()方法。 如果两个比较器等于()并且您已经应用了一个比较器,则不应该应用第二个比较器,因为它不起作用。 如上所述,这是一个提示。

Comparable ,JDK开发人员判断是否有用添加有关equals方法覆盖的任何信息。 Object的equals(Object obj) Javadoc应该足够了。