当前位置: 首页 > 知识库问答 >
问题:

为什么在java.util.比较器中不强制执行平等?

糜宜民
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) {
        //..
     }
 };

它是如何让接口允许我们不重写方法的?

共有2个答案

王彭薄
2023-03-14

因为每个对象都已经实现了equals()。

实际上,在比较器接口定义中再次指定equals()除了给一个记录合同及其与compareTo()的关系的机会之外,什么也做不了。

颛孙镜
2023-03-14

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

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

但是后来:

请注意,不重写Object.equals(Object)始终是安全的。

即使它是接口的一部分,怎么可能不重写equals()?因为这个方法已经为Java中的每个对象(在object类中)实现了。

接口中的声明只是通过添加额外的JavaDoc解释来强调equals()对于比较器的重要性。

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

 类似资料:
  • 有一个JavaBean汽车可能包含两个值:model和price。 现在假设我以这种方式重写equals()和hashcode()只检查模型: 这允许我检查arraylist是否已经包含同一型号的商品车(价格不重要),方法如下: 这是真的。没关系,因为汽车已经存在了! 但是现在我认为ArrayList不好,因为我想维护订购的项目,所以我用树集替换它,如下所示: }}); 但现在有一个问题,它返回F

  • 今天,我试图学习Java8中的一些特性,特别是关于Lambda表达式。我创建了一个新的Comaparator,如下所示: 当我阅读比较器接口内的代码时,我感到困惑。虽然通过接口比较器有两个方法compare()和equals(),但我们不需要全部实现它们。我已经找到了一些原因,为什么我们不需要在这里实现方法equals()。但我也读过javadocs 如果类声明实现接口,则该接口定义的所有方法必须

  • 问题内容: 输出: 为什么这样的输出?我期望作为第一种情况的结果。 问题答案: 区别在于6.5可以完全以float和double表示,而3.2不能完全以两种类型表示。并且两个最接近的近似是不同的。 float和double之间的相等比较首先将float转换为double,然后将两者进行比较。因此数据丢失。 您不应该比较浮点数或双精度数是否相等。因为您不能真正保证分配给float或double的数字

  • 问题内容: 我只是意识到,SQL Server比较器用于文本比较时不区分大小写。关于此功能,我有几个问题: 所有数据库都相同还是特定于SQL Server? 到目前为止,我一直在使用该功能来确保文本比较不敏感。遵循相同的方法还是个好主意吗? 如何在SQL Server中进行区分大小写的比较? 为什么操作员默认不区分大小写的比较? 问题答案: 不可以,区分大小写与等号无关。 区分大小写由数据库的排序

  • 问题内容: 在JBox2d中,存在以下代码: 我想知道这里的float <-> int位转换函数的作用是什么。这是否提供解决Java的float比较不准确性问题的方法(如果可能的话)?还是完全不同?我想知道它是否可以替代epsilon方法: PS。为了完整和有趣,这里是: 仅供参考,我可以完美地理解为什么在hashCode()中使用转换函数-哈希ID必须是整数。 问题答案: 解释中可以找到约书亚B

  • 当我跑的时候 在shell中,它返回。为什么?它应该是?当我跑的时候 它返回。