当前位置: 首页 > 面试题库 >

为什么equals在java.util.Comparator中不是必须实现的?

陈季
2023-03-14
问题内容

无论是Javadoc还是代码本身,Comparator接口都定义了:

 int compare(T o1, T o2);
 boolean equals(Object obj);

但这没有编译任何概率:

 Comparator a = new Comparator() {      
     @Override public int compare(Object o1, Object o2) {
        //..
     }
 };

但这确实是:

 Comparator a = new Comparator() {      
     @Override public boolean equals(Object comparator) {
        //..
     }
 };

接口不允许用户重写方法的方法是什么?


问题答案:

首先,JavaDocs清楚地解释了您应该实现此方法:

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

但后来:

请注意,始终不要覆盖即可Object.equals(Object)

equals()即使它是接口的一部分,如何也不可以覆盖它?因为已经为Java
中的Object每个对象(在类中)实现了此方法。

在接口的声明仅在那里强调的重要性,equals()至于Comparator通过增加额外的Javadoc解释。

顺便说一句,如果您的比较器是无状态的,则应该只有一个实例-在这种情况下,默认equal()实现就可以了。



 类似资料:
  • 问题内容: 如果我重写一个类两种方法,它必须确保,如果那么也必须是真实的。 有人可以告诉我一个简单的示例,如果违反了该示例,将会引起问题吗?我认为这与您使用该类作为Hashmap的键类型有关吗? 问题答案: 当然: 与: 从技术上讲应该是正确的,因为在两种情况下m == 3。 通常,HashMap的工作方式如下:它具有可变数量的通常称为“存储桶”的数量。存储桶的数量可以随时间变化(随着条目的添加和

  • 问题内容: 你知道吗 : 将输出: 这是由于(继承自)未覆盖的事实引起的。 您知道为什么会这样吗? 问题答案: 根据的合同,没有针对s 的通用equals()方法,因此无法提供一个。 请注意,它既不是Set也不是List,因此既不是数量也不是它不支持的原因。

  • 或者“为什么Sun/Oracle的家伙每次都强迫我们重写equals()和hashCode()?” 每个人都知道,如果你覆盖一个对象的equals()或hashCode(),你也必须覆盖另一个,因为这两者之间有一个约定: 请注意,每当重写hashCode方法[e.equals()]时,通常有必要重写该方法,以维护hashCode方法的一般约定,即相等的对象必须具有相等的哈希代码。-对象的API文档

  • 问题内容: 为什么字典键必须是不可变的?我正在寻找一个简单明了的原因,为什么Python字典中的键具有该限制。 问题答案: 在我的计算机上,有一个包含大量英语单词的文件: 让我们创建一个字典来存储所有这些单词的长度: 并且,为了踢球,我们将改组原始单词列表: 嗯,滚刀。无论如何…现在我们已经有点混乱了,我们变得有点偏执了(可能出于与渴望滚刀相同的原因),并且我们想检查字典中的所有单词是否都正确。我

  • 本文向大家介绍在.vue文件中style是必须的吗?那script是必须的吗?为什么?相关面试题,主要包含被问及在.vue文件中style是必须的吗?那script是必须的吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 style 不是必须的,script 是必须的,而且必须要写上

  • 本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha