在Java中覆盖equals()和hashCode()

Overriding equals() and hashCode() in Java

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Overriding equals and hashCode in Java

所有的,

我已经定义了我的类,以及覆盖equals()和hashcode()方法的对象。但是我不知道这些方法具体应该为我自己的类实现什么。任何人都能对自定义类的这些方法的实现有所了解吗?


你说你已经知道哪个自定义类需要重写hashcode/equals了?然后您还知道哪些属性(全局变量)决定每个类的相等性。

当您知道这些属性时,您可以手动实现hashcode/equals,也可以使用现代的IDE(如Eclipse、Netbeans等)生成方法。在Eclipse中,"源"菜单下有一个名为"generate hashcode()and equals()"的选项

alt text


对于equals,答案取决于您的业务需要是什么,也就是说,您的对象相等意味着什么。

hashcode()应该始终为一个对象返回一个唯一的值,除非该对象等于另一个对象。它应该取决于对象属性的值。


基本上,如果要将对象存储在集合(map、set、list)中,那么必须根据文档中定义的契约实现equals和hashcode方法。

否则,许多集合实现将没有预期的行为。有关实现线索,请阅读对象javadoc中的equals和hashcode。


Java理论与实践:破解它


在实现equals()时,请确保理解相等和标识之间的区别。两个对象实例可以是"equal",但不能相同。A.equals(B)是一个对相等性的测试,您的业务规则应该定义它。==是对对象标识的测试(同一对象实例)


阅读java.lang.Object中两种方法的API文档。它非常准确地描述了重写实现的行为方式。