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

时间:2010-10-12 21:52:12

标签: java

  

可能重复:
  Overriding equals and hashCode in Java

所有

我已经定义了我的类,并且还要覆盖equals()和hashCode()方法。但我不知道具体应该为我自己的课程实现这些方法。任何人都可以对自定义类的这些方法的实现有所了解吗?

6 个答案:

答案 0 :(得分:9)

您说您已经知道哪个自定义类需要覆盖hashCode / equals?然后您还知道哪些属性(全局变量)确定每个类的相等性。

当您了解这些属性时,您可以手动或通过使用现代IDE(如Eclipse,NetBeans等)生成方法来实现hashCode / equals。在Eclipse中,有一个名为“Generate hashCode()和equals()”的选项。 “来源”菜单

alt text

答案 1 :(得分:3)

对于equals,答案取决于您的业务需求,即对象等于什么意味着什么。

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

答案 2 :(得分:2)

答案 3 :(得分:2)

基本上,如果要将对象存储在集合中(Map,Set,List),那么必须根据文档中定义的合同实现equals和hashCode方法。

否则,许多集合实现将不具有预期的行为。有关实现线索,请阅读equalshashcode的Object Javadoc。

答案 4 :(得分:1)

阅读java.lang.Object中两种方法的API文档。它完全描述了非常覆盖实现应该如何表现。

答案 5 :(得分:1)

实现equals()时,请确保理解相等和身份之间的区别。 两个对象实例可能“相等”但可能不相同。 a.equals(b)是对等式的测试,您的业务规则应该定义。 ==是对象标识的测试(同一对象实例)