Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么equals()在Java中有Comparator但在Comparable接口中没有_Java - Fatal编程技术网

为什么equals()在Java中有Comparator但在Comparable接口中没有

为什么equals()在Java中有Comparator但在Comparable接口中没有,java,Java,equals()方法存在于Comparator接口中,但它不存在于Comparable接口中。为什么?另外,根据equals()和hashcode()之间的约定,两者都必须被重写,而在Comparator中则不是这样。为什么?有人能帮我理解它背后的概念吗。一个实现Comparable的类已经从Object继承了一个equals方法,Comparable对equals()没有额外的约束 Comparator要求MyComparatorType.equals(Comparator other)返回t

equals()方法存在于Comparator接口中,但它不存在于Comparable接口中。为什么?另外,根据equals()和hashcode()之间的约定,两者都必须被重写,而在Comparator中则不是这样。为什么?有人能帮我理解它背后的概念吗。

一个实现Comparable的类已经从Object继承了一个equals方法,Comparable对equals()没有额外的约束

Comparator要求MyComparatorType.equals(Comparator other)返回true,我的Comparator和另一个Comparator都采用相同的顺序。这允许进行一些性能改进和优化,如果违反此特殊约定,可能会在某个时间点导致运行时异常

相关行来自:

指示其他对象是否“等于”此比较器。此方法必须遵守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)
在所有类中都存在。它来自
对象
类。

Comparator
接口中,添加了
equals(objectobj)
声明来覆盖相关的javadoc,以便客户端意识到覆盖这个类的
equals()
方法的兴趣。这是一个暗示

比较器中
等于(Object obj)
的Javadoc:

指示其他对象是否“等于”此比较器。 此方法必须遵守Object.equals(Object)的一般约定。 此外,仅当指定的对象 也是一个比较器,它施加与此相同的顺序 比较器。因此,comp1.equals(comp2)意味着 sgn(comp1.compare(o1,o2))==sgn(comp2.compare(o1,o2))对于每个 对象引用o1和o2

请注意,不重写Object.equals(Object)总是安全的。 但是,在某些情况下,重写此方法可能会提高性能 通过允许程序确定两个不同的 比较器施加相同的顺序

重点是什么? 假设您必须使用不同的比较器多次调用
Collections.sort()
方法。如果两个比较器为equals(),并且您已经应用了一个比较器,则不应应用第二个比较器,因为它将无效。如前所述,这是一个暗示

Comparable
中,JDK开发人员认为添加关于
等于方法重写的任何信息都是无用的。对象的
等于(objectobj)
Javadoc就足够了

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

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

也就是说,仍然值得一问为什么Comparator会声明它,因为Comparator(和所有类型一样)已经是Object的一个子类型。原因很简单,Comparator想要对equals(…)施加一些额外的要求,所以它需要提供特定的Javadoc。(特别是,它要求除非两个比较器实现相同的排序,否则永远不能将它们视为相等的。比较器的实现可以通过使用Object中的equals(…)或定义更精确的自定义equals(…)来满足这一要求。)

另外,根据equals()和hashcode()之间的约定,两者都必须被重写,而在Comparator中则不是这样

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


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

Comparator
解决了另一个问题。