若两个对象equals相等(重写了equals方法),但不在一个区间(没有重写hashcode方法),因为hashCode的值在重写之前是对内存地址计算得出,所以根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:
1 如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法,也就是说hashCode值要和类中的成员变量挂上钩,对象相同–>成员变量相同—->hashCode值一定相同。
2 如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。
注意:仅仅重写equals方法,按道理应该是不对的,在重写equals方法时,也要重写hashcode方法,并且要保持判断的一致性。做到相等(equals)的两个对象的hashcode一定要相同。
hashset,hashmap中放入对象时,会先判断hashcode,hashcode不同,则认为是不同的对象;如果hashcode相同,则去比较equals,如果equals不同,则认为不同对象,相同则认为是相同对象。(实际上他还用==比较了对象,请看下面链接所写文章)
https://blog.youkuaiyun.com/qq_21688757/article/details/53067814?ticket=ST-56532-unjRzSC7ufBt3I3nKejO-passport.youkuaiyun.com