在java中实现equals方法

问题描述:

这是我的Coor类的equals类的实现,它只包含2个x和y。这是实施这种方法的适当方式吗?在java中实现equals方法

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; 
     } 
    } 
+2

是的。如果所有的字段都是相同的,并且这是您“平等”的意思,那么您已经正确地制定了方法。如果你正在比较继承自当前('this')类的东西,那么这将不起作用,但如果它们是可行的,它将起作用。 – bdares

+1

不要忘记重写散列码函数,如果你希望在集合中使用它(即使在屏幕后面) –

你可以添加一个支票反思平等(等于个体经营):

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; 
} 
+0

你能解释一下“this == obj”实际上是在比较什么?它只是检查它是否是同一个对象? – user979490

+1

对象的内存位置。 –

+1

它检查2个对象引用('this'和'obj')以查看它们是否指向相同的内存位置。如果他们这样做,他们是同一个对象。 – Pat

是的,它会的。

另外一定要覆盖你的hashCode()方法 - 绝对不要重写一个而不做另一个,它会混淆你的集合。

你的情况下,可以使用一个散列结果,其中它只是转移的整数32位中的一个,并把它添加到其他创造一个完全独特的长(一个完美的哈希在这种情况下功能 - 无碰撞)

+0

因为我不知道haseCode()是什么或它是什么但是,谢谢你的建议 – user979490

似乎确定。 为了简洁起见,你可以这样做:

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?

这一个巨大的关于头痛的节省您的未来。

检查了这一点:

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

如果物品为太多细节,那么短它是: 你的实施是正确的,但你应该记住一些其他的事情:

  1. 你还必须实现hashCode。

  2. equals将不再对对象的身份进行commpare。听起来不像是你的问题。

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

这里有一个更简单的方法:

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

我相信这会工作,快速浏览。我这样说是因为:

  1. 它处理空/不正确的类型。
  2. 执行x.equals(y)将产生与y.equals(x)相同的结果。
  3. 执行x.equals(x)将返回true。
  4. 执行x.equals(y)== true并且y.equals(z)== true意味着x。等于(z)== true

虽然这个问题肯定有很多次被问过。看到这里:Overriding equals and hashCode in Java。一本名为有效的Java的书也非常详细地讨论了这个话题,并且特定章节被链接到那里。

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

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