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

使用compareTo实现equals方法

翟宾实
2023-03-14
问题内容

常见问题:equals在Java中实现默认方法的覆盖时,与仅将已实现的compareTo方法与将独立逻辑写入equals方法相比,我应该担心什么?我注意到有人在另一个问题中提及,该问题foo.equals((String)null)返回false而String.compareTo((String)null)抛出NullPointerException。是什么使这些不一致的结果成为理想的功能?

采样equals方法:

@Override
public boolean equals(Object obj) {
    if (obj != null && obj instanceof MyClass) {
        MyClass msg = (MyClass)obj;
        return this.compareTo(msg) == 0;
    }
    return false;
}

编辑:
引用可比文档

当且仅当e1.compareTo(e2)==
0对于C类的每个e1和e2具有与e1.equals(e2)相同的布尔值时,才可以认为C类的自然排序与equals一致。
null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)仍应引发NullPointerException。

编辑:

经过进一步审查,我发现值得注意的是,可比文档也声明了以下内容:

实现者必须确保所有x和y的sgn(x.compareTo(y))==
-sgn(y.compareTo(x))。(这意味着x.compareTo(y)必须抛出异常,而y.compareTo(x)则抛出异常。)

因此,Ergo
null.compareTo(x)显然会抛出NPE,因此也x.compareTo(null)应该抛出NPE。对于平等,不一定是这种情况。我对NPE的正确处理非常重视,因此我认为这相对有意义。


问题答案:

equals()和之间的区别compareTo()是,equals()仅检查两个对象是否彼此相等,其中compareTo()使用来标识指定类的实例的自然顺序。此外equals()方法有合同hashCode()的方法,但compareTo()并非如此。

根据JavaDoc:

请注意,null不是任何类的实例,即使e.equals(null)返回false,e.compareTo(null)也应引发NullPointerException。

强烈建议(但并非严格要求(x.compareTo(y)==
0)==(x.equals(y))。一般而言,任何实现Comparable接口且违反此条件的类都应明确指出这一事实。推荐的语言是“注意:此类具有与等式不一致的自然顺序”。

您可以随意compareTo()在您的equals()方法中重用方法逻辑,但请记住与的所有合同equals()hashCode()以及与JavaDoc签订的compareTo()方法合同。如果它们彼此不冲突,则继续。

我认为合同的执行更为重要。



 类似资料:
  • 本文向大家介绍Java实现equals()方法,包括了Java实现equals()方法的使用技巧和注意事项,需要的朋友参考一下 示例 要轻松实现对象的equals方法,可以使用EqualsBuilder类。 选择字段: 使用反射: 布尔参数用于指示是否等于应检查瞬态字段。 使用反射避免某些字段:            

  • 当实现Comparable接口并重写compareTo方法时, 第三行,我意识到当我重写它时,我可以使用compareTo,它会自动按照自然顺序进行比较。但是在可比较的界面中,它不是一个抽象的方法。没有定义它,它还可以比较吗?还有,为什么我不需要使用super关键字来区分这个比较。

  • 本文向大家介绍Java中替代equals,compareTo和toString的方法,包括了Java中替代equals,compareTo和toString的方法的使用技巧和注意事项,需要的朋友参考一下 我们都曾在POJO中重写过equals(),compareTo()和toString()方法。但是另有其他能做到职责分离的更好的方法并带来更简洁的代码。阅读这篇文章来一探究竟吧! 更简明的职责——

  • 如果你有如下需求,你必须重载 equals() 和 hashCode() 方法: 想把持久类的实例放入 Set 中(当表示多值关联时,推荐这么做),而且 想重用脱管实例 Hibernate 保证,仅在特定会话范围内,持久化标识(数据库的行)和 Java 标识是等价的。因此,一旦我们混合了从不同会话中获取的实例,如果希望 Set 有明确的语义,就必须实现 equals() 和 hashCode()。

  • 问题内容: 我应该如何实施和在Java下面的类? 问题答案: 在Eclipse中,右键单击->源->生成hashCode(),然后equals()给出以下信息: 我已选择代码作为唯一字段

  • 本文向大家介绍Java中equals()方法重写实现代码,包括了Java中equals()方法重写实现代码的使用技巧和注意事项,需要的朋友参考一下 Java中equals()方法重写实现代码   Java中的equals()方法是在Object类中定义,Object类是所有类的父类。换句话说,任何类都隐含地继承了该方法。判断两个对象的内容是否相同,必须使用equals()方法,对于没有重写该方法的