在java中实现equals方法

时间:2011-10-05 00:08:53

标签: java

这是我对Coor类的equals类的实现,它只包含2个整数x和y。这是实现这种方法的正确方法吗?

 public boolean equals(Object obj) {
        if (obj == null || obj.getClass() != this.getClass()) {
            return false;
        }
        Coor temp = (Coor) obj;
        if (temp.x == this.x && temp.y == this.y) {
            return true;
        } else {
            return false;
        }
    }

7 个答案:

答案 0 :(得分:7)

你可以再添加一个检查反身相等(等于自我):

 public boolean equals(Object obj) {

    // Reflexive equality: did I get passed myself?
    if(this == obj){
        return true;
    }

    if (obj == null || obj.getClass() != this.getClass()) {
        return false;
    }

    Coor temp = (Coor) obj;
    return temp.x == this.x && temp.y == this.y;
}

答案 1 :(得分:5)

是的,它会的。

还要确保覆盖你的hashCode()方法 - 永远不要覆盖一个而不做另一个,它会混淆你的集合中的地狱。

您的情况可以使用散列,它只是将其中一个整数移位32位并将其添加到另一个创建一个完全唯一的长整数(在这种情况下是一个完美的散列函数 - 没有碰撞)

答案 2 :(得分:3)

似乎没问题。 为简洁起见,您可以这样做:

return temp.x == this.x && temp.y == this.y

而不是

if (temp.x == this.x && temp.y == this.y) {
        return true;
    } else {
        return false;
    }

另外,请记住对象合同(严重!)。

请参阅此处接受的答案: What issues should be considered when overriding equals and hashCode in Java?

这可以为您节省大量未来的头痛。

答案 3 :(得分:1)

检查出来:

http://www.javapractices.com/topic/TopicAction.do?Id=17

如果那篇文章太详细,那么缺点是: 你的实现是正确的,但你应该记住一些其他的事情:

  1. 您还必须实现hashCode。

  2. equals将不再使用该对象的身份。听起来不是那个问题。

  3. 您可以将@Override注释添加到您的equals方法中。

答案 4 :(得分:0)

这是一种更直接的方式:

public boolean equals(Object other) {
    return other instanceof Coor
      && ((Coor) other).x == x
      && ((Coor) other).y == y
}

答案 5 :(得分:0)

我相信这会很快发挥作用。我这样说是因为:

  1. 它很好地处理了null /不正确的类型。
  2. 执行x.equals(y)将得到与y.equals(x)相同的结果。
  3. 执行x.equals(x)将返回true。
  4. 执行x.equals(y)== true和y.equals(z)== true表示x.equals(z)== true
  5. 这个问题之前肯定已被问过很多次了。见这里:Overriding equals and hashCode in Java。一本名为 Effective Java 的书也非常详细地讨论了这个主题,并且特定章节与之相关联。

答案 6 :(得分:0)

只有一个来源可以读取如何覆盖Joshua Bloch的“Effective Java”的equals和hashCode:chapter 3

如果你有一个好的IDE,比如IntelliJ,它会以正确的方式为你生成equals和hashCode。