有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果没有定义equals()和hashCode(),我应该如何实现Comparable?

我的团队正在处理的代码有几个类,其中equalshashCode未在类层次结构中定义。我们希望实现Comparable,这样compareTo与使用hashCodeequals一致,如下所示:

class MyClass implements Comparable<MyClass>
{
    private String myProperty;
    // Other properties, etc.
    ....

    public int compareTo(MyClass obj) {
        // Natural ordering comparisons
        ...
        // Reach here if natural ordering properties are equivalent
        return new Integer(this.hashCode()).compareTo(new Integer(obj.hashCode());
    }
}

这被认为是实施Comparable的有效手段吗?使用默认的hashCode实现是否有我应该注意的缺陷

更新:我们努力追求的行为如下:

  1. 首先按照我们定义的自然顺序比较类属性
  2. 如果两个对象的一个给定属性是等价的,那么我们将转到排序中的下一个
  3. 如果所有属性都相等,则仅当this.equals(obj)时才返回0

共 (2) 个答案

  1. # 1 楼答案

    是的,这是一个有效的方法。显然,您希望对象在其他值上具有相同的固定顺序(我说的对吗?您没有在这里解释hashcode用法的目的)。 我唯一要做的就是复制Integer的java代码。compareTo()在compareTo方法中,因此不必为每次比较创建2个整数

  2. # 2 楼答案

    不,这不是有效的实施方法。因为,假设您对equals方法中MyClass的两个不同对象的全自然排序比较实现,然后当比较两个对象的hashcode时,它将返回false。这是因为在本例中,Object类的hashcode方法将在默认情况下被调用(因为您没有提供自己的hashcode方法),这对于不同的对象是不同的。因此,无论所有自然排序比较结果是true,MyClass的两个对象永远不会相等