hashCode和equals方法主要和映射(Map接口)相关. 我们知道Map接口的类会使用到键(Key)的哈希码, 当我们调用put()/get()方法操作Map容器时, 都是根据Key的哈希码来计算存储位置的, 因此如果我们对哈希码的获取没有相关保证, 就可能会得不到预期的结果.
hashCode就是哈希码(或者散列码), 是由对象导出的一个整型值, 哈希码是没有规律的, 如果x与y是两个不同的对象, 那么x.hashCode()与y.hashCode()就不会相同 —— 只要x和y对象没有重写hashCode()方法, JVM规范中明确要求它们的散列码不会相同.
String(字符串)的哈希码是由字符串的内容导出的, 也就是String类中重写了hashCode()方法.
HashCode
1、map的数据结构是数组+链表的结构(jdk1.8是数组+链表+红黑树),hashcode用来定位数组下标索引,找到对象存放的桶,然后遍历桶内链表、树,找到对应的元素。
2、Object默认的hashcode实现对于不同的对象会返回不同的值,因为是根据内存来得到的hashcode,因此,在上面那个例子中,不同的对象(即使同一个类型)有着不同的hashcode;
3、相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的
4、hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
5、在set存储的是不重复的对象,而判断对象是否相等是调用的hashCode和equals进行判断的,所以,如果要判断两个对象逻辑上的不相等,那就必须重写这两个方法。
所以在向set中添加对象时,必须重新这两个方法,且一般情况下,这两个方法要一起重写。