3.你重写过hashcode和equals么,要注意什么

首先,我们首先要知道hashcode和equals分别是什么:

Hashcode:

hashcode对于集合框架中hashset,hashmap,hashtable这种使用哈希表结构的实现类来说,通过hashcode计算出的哈希码就是各自的“身份证”,确定存于哪个位置中。其作用有:
1.快速定位对象,提高哈希表集合的性能。
2.只有当哈希表中对象的索引即hashCode和对象的属性即equals同时相等时,才能够判断两个对象相等。
3.从上面可以看出,哈希码主要是为哈希表服务的,其实如果不需要使用哈希表,也可以不重写hashCode。但是SUN公司应该是出于对程序扩展性的考虑(万一以后需要将对象放入哈希表集合中),才会规定重写equals的同时需要重写hashCode,以避免后续开发不必要的麻烦。
hashCode方法可以这样理解:它返回的就是根据对象的内存地址换算出的一个值。这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。

Equals:

Java语言规范要求equals需要具有如下的特性:
自反性:对于任何非空引用 x,x.equals() 应该返回 true。
对称性:对于任何引用 x 和 y,当且仅当 y.equals(x) 返回 true,x.equals(y) 也应该返回 true。
传递性:对于任何引用 x、y 和 z,如果 x.equals(y)返回 true,y.equals(z) 也应返回同样的结果。
一致性:如果 x 和 y 引用的对象没有发生变化,反复调用 x.equals(y) 应该返回同样的结果。
对于任意非空引用 x,x.equals(null) 应该返回 false。

因此,我们在重写Eqeals方法中,必须遵守这5个条件:自反;对称;传递;一致;对空引用必须范false

最后总结就是两种方法都是一定相关联的:
1.当两个对象进行equalsb方法比较相等时,则hashcode码一定相等,但是相反,通过hashcode方法相等,但equals却不一定相等
2.当重写equals方法时,一定要同时把hashcode方法一并重写,因为要保证在实现hash表的扩展性

你可能感兴趣的:(java个人理解)