1、首先 equals 和 hashcode 是本身是相互独立的,之所以要求在实现 equals 的时候同时也要实现 hashcode 是基于性能的考虑
往 set 里面插入元素的时候,为了保证每次插入的元素都是与之前插入的元素是不同的。怎么保证不同呢?当然是用 equals 方法了,可是如果set里面已经有1000个元素了,现在插入新的元素,岂不是要求新元素与已有的1000个元素一一执行equals方法,那效率也太低了,这个时候,hashcode 方法就起作用了,我先对待插入元素执行 hashcode 方法,生成一个座位号,然后看这个座位号是否已经有人坐了,如果没有人坐,那就说明 set 里面还没有当前插入的这个元素,可以将其插入,如果位子被占了,再用即将插入的元素与在座的元素equals,如果相同,则说明是重复元素,不能插入重复元素,如果不相同,则采取其他办法,将即将插入的元素插入新的座位。用这个办法比之前的将待插入元素与已有的1000个元素一一对比可快多了。equals方法与hashcode相结合大大提高了查找效率。
2、hashcode除了在往set里面插入元素的时候可以起作用,再往map里面put(key,value)的时候对于key的判断也是基于同样的方法。
3、x.equals(y)则hashcode(x)=hashcode(y),但是反之不成立。比如字符串Aa与字符串BB的hashcode都是2112。
附上java api 里面 hashcode 和 equals 的描述。