2

我一直在尝试实现equals和hashCode方法,所以我可以使用arrayList的remove方法。

当我执行以下

    Node a = new Node(new Coord(0,0));
    System.out.println(a.equals(nodes.get(0)));
    System.out.println(nodes.get(0).equals(a));
    System.out.println(a.hashCode() == nodes.get(0).hashCode());
    System.out.println(nodes.remove(a));

我得到以下输出:

true
true
true
false

问题是,当第 4 个返回 false 时,输出的前 3 个如何返回 true。方法 remove 应该遇到 nodes.get(0) 并将其与 a 进行比较。

这些是我的 equals 和 hashCode 方法:

public int hashCode() {
    return coord.hashCode();
}

public boolean equals(Node node) {
    return (node != null) && (this.hashCode() == node.hashCode());
}

它调用定义为的方法 coord.hashCode() :

public int hashCode() {
    int hash = 23;
    hash = 31 * hash + this.x;
    hash = 31 * hash + this.y;
    return hash;
}
4

2 回答 2

11

您当前的equals()方法不会覆盖Object.equals(),它会重载它。

更改equals()以接受Object参数:

public boolean equals(Object o) {
    return (o instanceof Node) && (this.hashCode() == o.hashCode());
}

Java 具有@Override可以放在方法上的注释,因此编译器会告诉您您的方法是否实际上没有覆盖。使用它是一种很好的做法,因此您可以在编译时避免此类问题。


请注意,您的 equals 实现有一个错误:您不应该比较哈希码 - 两个“不相等”的对象可能(不幸地)共享相同的哈希码。

比较字段,而不是哈希码。

于 2013-06-23T21:44:06.100 回答
1

您不能使用方法 hashCode 比较等于为什么:

a.equals(b) == true, a.hashCode() 是强制的 == b.hashCode()

a.hashCode() == b.hashCode(), a.equals(b) NOT 是强制的,more 可以 == false

使用一个属性 (x) 的实现示例。通过eclipse生成:

public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    return result;
}

public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Node other = (Node) obj;
    if (x != other.x)
        return false;
    return true;
}   
于 2013-06-23T21:59:15.317 回答