看了很多资料还是不明java覆写equals方法时候,一定要覆写hashCode方法,和如何覆写?

1、对引用类型来说,如果我比较两对象地址是否相等,或者是否是引用自同一对象,用==方法,如果比较两对象内容是否相等,用覆写的 equals方法就行了?那么如果我只覆写equals方法不覆写hashCode方法,是什么效果呢,难道我a.equals(b)就不是在比较两对象的内容吗,如果我覆写了hashCode方法,a.equals(b)难道就成了比较两对象地址了?等同于==了?
2、如果在覆写equals方法时候要覆写hashCode方法,应如何覆写呢,有什么规范呢?

复写hashcode的原因是很多系统类判断对象是否相等,判断的方法是,1 类型相同,2 hashcode相同。 例如 hashMap hashSet 等。

如果你不复写hashcode,hashcode返回的是地址值,也就是意味着不是同一个对象就不会相同。这样在某些场合会造成混乱。 也就是你自己的equal判断相等,但系统判断不相等。

hashCode返回一个串就行了。一般吧所有成员函数tostring拼起来就行了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-23
刚回答了一个类似问题,看下是否能解决楼主问题吧
1、这是java se中非常典型的笔试和面试题。
2、"==",即全等比较,它判断的是地址是否相等,如果地址相同的话,也就不用比较eqauls了。
3、原始的"equals"是和“===”的完全等同,即Object的equals和“=="完全等同。
4、java se规范约定,如果重写equals方法,那也要重写hashCode方法,使equals为真的情况,hashCode的值也是相同的,此为约定而非强制。
5、回归原题,只要重写了equals方法,就和”===“不等等了。
再思考下吧。追问

如果我只覆写equals方法而不覆写hashCode方法会出现什么情况呢,当我两个对象内容相等但地址不等时候,a.equals(b)方法,会是什么结果呢?

追答

1、不写的话, 只要你不涉及hash结构的操作是没有任何影响的,只是为了符合规范往往是要重写的。
2、在涉及到hash结构的对象操作,如hashMap或是hashSet对象在做contains等方法时,要想返回true,则必须equals和hashcode均相同才会返回true。除此之外均无影响。

本回答被提问者采纳