在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;
}
}
你可以添加一个支票反思平等(等于个体经营):
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;
}
你能解释一下“this == obj”实际上是在比较什么?它只是检查它是否是同一个对象? – user979490
对象的内存位置。 –
它检查2个对象引用('this'和'obj')以查看它们是否指向相同的内存位置。如果他们这样做,他们是同一个对象。 – Pat
是的,它会的。
另外一定要覆盖你的hashCode()方法 - 绝对不要重写一个而不做另一个,它会混淆你的集合。
你的情况下,可以使用一个散列结果,其中它只是转移的整数32位中的一个,并把它添加到其他创造一个完全独特的长(一个完美的哈希在这种情况下功能 - 无碰撞)
因为我不知道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
如果物品为太多细节,那么短它是: 你的实施是正确的,但你应该记住一些其他的事情:
你还必须实现hashCode。
equals将不再对对象的身份进行commpare。听起来不像是你的问题。
您可以将@Override注释添加到您的equals方法中。
这里有一个更简单的方法:
public boolean equals(Object other) {
return other instanceof Coor
&& ((Coor) other).x == x
&& ((Coor) other).y == y
}
我相信这会工作,快速浏览。我这样说是因为:
- 它处理空/不正确的类型。
- 执行x.equals(y)将产生与y.equals(x)相同的结果。
- 执行x.equals(x)将返回true。
- 执行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。
是的。如果所有的字段都是相同的,并且这是您“平等”的意思,那么您已经正确地制定了方法。如果你正在比较继承自当前('this')类的东西,那么这将不起作用,但如果它们是可行的,它将起作用。 – bdares
不要忘记重写散列码函数,如果你希望在集合中使用它(即使在屏幕后面) –