今天的文章从一道面试题开始:
重写equals为什么要重写hashcode?
就由下面这张代码来分析
首先是弄了一个QueryBO类,然后重写了equals和hashCode方法。
然后在测试类中,定义了两个实例对象queryBO1和queryBO2.分别设置了属性值。
然后看看输出了什么。
第一个是1,第二个是T。
因为对比hashcode,比较的是query3的值,所以hashcode相同,然后再嘴比equals,发现对比的是query2,也相等。所以这两个实例对象是相等的。
看不懂,那我们从下面一点一点地分析。
这个就输出的是True。
然后这个输出1,因为两个对象相等。
那如果我重写一下equals方法呢。将equals中的return里换成query2
输出的就是2个对象,false.
false大家都能理解。
结论1:equals不相等,那么对象一定不相等
再比如这个
输出的是true。但是看代码的话hashcode是不一样的,仅仅equals是一样的。
所以对象是相等的。但是输出的set是两个对象。而对于set他们,因为hashcode不相等,所以不会比较equals
得出结论:equals相等,对象一定相等
这个可以自己照着此代码敲一下,就会理解了。
问题:
hashcode相等,对象一定相等?不一定,hashcode相等还要比较equals
hashcode相等的两个字符串一定相等么?这个也不对,这个看一张图
可以看到hashcode相等,但字符串不一定相等。