关于重写equals方法
最近小伙伴问了我个问题:
在Set里存放对象,如果有两个对象属性相同,那么怎么能保证只存在一个对象?
HashSet是基于HashMap实现的,所以要看看HashMap的源码
|
|
可以看到,HashMap是根据hashCode来确定在Node数组中的位置,那么要使HashSet能够对对象去重,就首先需要重写对象的Hash方法,使相同值的对象的HashCode相等,其次还需要重写equals方法,因为即使hashCode相同还是会存放到Map中,这种情况属于Hash冲突,会使用链表存放该对象。
HashCode和equals的关系?
- 以下是我的理解
equals比较变量或者对象是否“相同”,这个相同是偏向于业务上的相同,和人理解的“相同”是一个概念。计算机判断的“相同”是hashCode是一致,但如果一个对象,那么计算机并不知道怎么判断他们是否相同
(总不能比较对象字节流吧。。),那么就只能使用Object的hashCode方法判断值是否一致。如果没重写就会导致计算机认为是不同的对象。所以就有了重写equals()一定要重写hashcode()的说法了。但注意hashCode相同equals不一定要相同,因为这个是由于hash算法的优劣决定的。
|
|
注意Integer等包装类型:
1.Integer 类型的值在[-128,127] 期间,Integer 用 “==”是可以的 , Integer 与 int 类型比较(==)比较的是值。Integer和int比较会自动拆箱,可以用==或equals
2.大于127比较两个Integer用intValue 然后在 == 或者直接equals