最近有一位面试官问我,我有一个类,在其中覆盖了其equals()
方法,但没有覆盖我的hashCode()
方法。
现在是否需要也覆盖我的hashCode()
方法呢?
如果我不覆盖我的哈希码方法会发生什么,将会维护其不允许重复的唯一属性吗?
这个问题涉及到Set
的内部实现,我的困惑在于,如果两个对象返回不同的hashCode()
,那么根据我的理解它们的equals()
不会被检查,然后如果这两个对象相等,则会违反Set
的唯一属性。
这是真的吗?
最近有一位面试官问我,我有一个类,在其中覆盖了其equals()
方法,但没有覆盖我的hashCode()
方法。
现在是否需要也覆盖我的hashCode()
方法呢?
如果我不覆盖我的哈希码方法会发生什么,将会维护其不允许重复的唯一属性吗?
这个问题涉及到Set
的内部实现,我的困惑在于,如果两个对象返回不同的hashCode()
,那么根据我的理解它们的equals()
不会被检查,然后如果这两个对象相等,则会违反Set
的唯一属性。
这是真的吗?
您应该始终覆盖这两个方法。它们是合同的一部分。
查看Java文档并确保满足其中的详细信息。 Eclipse也可以为您生成这些方法。
两者都是推荐的。
例如,如果您有一个超类Person
,具有属性id
、name
、surname
,并且您基于name
和surname
定义了equals
和hashCode
,以及一个具体的子类Contact Person
,具有额外的属性,如email
,则重要的是为您的类Contact Person
定义新的equals
和hashCode
。如果您的具体类Contact Person
实现了一个将email
属性作为唯一字段的实体,则仅基于email
重新定义equals
和hashCode
就足够了。不过,基于name
、surname
和email
定义一个新的equals
和hashCode
更好。