日期:2014-05-20  浏览次数:20741 次

如何回答为什么要重写equals和hashCode才漂亮
在面试当中经常给问到为何要重写equals 和hashcode ? 在什么情况下要重写
如果只重写 equals 不重写 hashcode 会有什么后果

这样的问题 要如何才能回答 才漂亮呢?

------解决方案--------------------
我记得是:当要比较对象的内容而不比较引用时便重写equals方法 但重写equals方法便一定要重写hashcode方法,java机制会在调用equals方法时自动调用hashcode方法
------解决方案--------------------
重写equals 方法不一定要重写hashcode 吧
------解决方案--------------------
好像当把对象存入map时会需要重写hashCode
------解决方案--------------------
个人理解:
首先:equals方法和hashCode方法都是Object类的方法,在Object类中的equals方法是直接用“==”来比较的,而“==”比较得是引用的地址是否相等,如一个类A的两个实例b、c,在使用b.equals(c)时他比较得是b、c这两个引用的地址(他们是不是指向同一个对象)而不是引用所指向的对象内容,而hashCode方法则是返回该对象的哈希码值,也就是对象再内存中的实际地址值(对象所占内存的首地址);当我们在实际应用中需要根据业务逻辑来对两个对象做相等判断时就不能直接使用Object中定义的equals方法了,所以要重写equals方法,而对于hashCode方法,在javaAPI中有说明,当两个对象使用equals比较相等时总是会返回相同的一个整数值,那么这里既然equals的比较策略以及变了,那hashCode方法当然也不能按照原来的策略来生成hashCode值了,所以也要一通重写了,而如果、这时候不重写hashCode的话,即便你用equals方法比较的到两个对象是相等的结论那你也得不到相同的哈希码,至于什么时候会要求重写这两个方法其实很难说,都是根据业务要球来做。没有必要自己写个测试类来测试System.out.println("123456")这样一句话还要重写equals和hashCode吧。
------解决方案--------------------
感觉5楼说的不错,我只是说一下自己的理解:首先都是object类的方法,Object类的equals比较的是对象的地址,hashcode则是对象的哈希码值,想set集合添加不同的数据就是重写了这两个方法,要不然每次都遍历原先的set内容,效率太低,还有就是new String("a").equals("a") 返回true,就是String重写equals方法,从而比较内容,最后,两个对象equals相等,hashcode一定相同,hashcode相同,equals不一定相同。
纯属自己理解,虚心接受指正!!