Comparator 接口有自己的equals()
方法。默认情况下,任何类都将equals()
通过 Object 类获得。equals()
接口内部需要有什么方法?
8 回答
Comparator
细化合约Object.equals
:它必须满足由Object.equals
and then some设置的约束。
此外,只有当指定的对象也是一个比较器并且它强制执行与此比较器相同的排序时,此方法才能返回 true。因此,
comp1.equals(comp2)
意味着sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))
对于每个对象引用o1
和o2
.
声明一个equals
insideComparator
允许您以 javadoc 的形式记录它。
请注意,API 的文档也用作合同,因此这里不仅仅是化妆品。这是其他代码和您的代码可以依赖的显式约束。
在您没有建立较少方法的类似情况下,它也可以用作记录意图。即,Interface.method
应该在那里,不管它的超级接口如何发展。
从 Java文档Comparator
中,有它自己的equals()
方法的原因:
但是,在某些情况下,重写此方法可能会通过允许程序确定两个不同的比较器施加相同的顺序来提高性能。
阅读它的javadoc。equals()
如果您选择在实现比较器的类中覆盖它,它只是为了解释必须返回的内容。您可能认为没有比较器可以等于任何其他比较器,但事实并非如此。如果两个比较器对任何参数返回相同的值,您可能会认为它们是相等的,但事实并非如此。javadoc 解释说,如果两个比较器强加相同的顺序,则无论给出什么参数,它们都是相等的。javadoc还说:
请注意,不要覆盖 Object.equals(Object) 总是安全的
大多数时候,您不会equals()
在比较器中覆盖。
从技术上讲,方法的声明是多余的(编译器不在乎),但是......
在此接口中声明 equals 方法使其成为调用者和不同比较器之间合同的一部分,并允许它指定/扩展其语义。
它指定两个比较器只有在它们使用它们的 compare() 方法强制相同的排序时才相等。这扩展了 Object.equals() 的语义,因此必须在接口中记录。
来自文档:
不覆盖 Object.equals(Object) 总是安全的。但是,在某些情况下,重写此方法可能会通过允许程序确定两个不同的比较器施加相同的顺序来提高性能。
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() 方法实现只检查两个引用是否指向同一个对象。它不适用任何比较。您将在您的班级(或可能在您的界面)中提供对象相等的标准。
Then what is need to have equals() method inside an interface?
显然,每当你在对象小于时实现,大于时你必须在它们相等时实现。因此,您应该提供检查相等性的逻辑,而不是依赖默认的 Object equals() 方法
提供 in的equals()
方法Comparator
是为了强制实现Comparator
接口的用户equals()
使用一些额外的规则和约束来实现,除了已经应用在equals()
from上的规则和约束Object
。
附加规则是:
此方法必须遵守Object.equals(Object)的一般约定。此外,只有当指定的对象也是一个比较器并且它强制执行与此比较器相同的排序时,此方法才能返回 true。因此,comp1.equals(comp2)意味着 sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))对于每个对象引用o1和o2。
将 Object 方法放在接口声明中允许 Javadoc 声明的含义 equals 需要在实现该接口的类中具有。