1.二者都是Object类中的方法:

  1. public native int hashCode();
  1. public boolean equals(Object obj) {
  2. return (this == obj);
  3. }

hashCode:是一个native方法,返回的是对象的内存地址,
equals:对于基本数据类型,==比较的是两个变量的值。对于引用对象,==比较的是两个对象的地址。

  1. 如果重写了equals方法,必须重写hashCode方法,从而保证只要a.equals(b),那么a.hashCode()必须和b.hashCode()相等
  2. 重写equal方法必须也重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable(可以参考源码有助于理解)类时进行比较。

链接1
链接2

只需要看这篇博客就够了
比如我新建一个People类,
然后new了两个对象,参数都一样,我们逻辑上把他们看成一个人。
但是当我们将两个对象作为key传入hashmap中时,就会存在两条记录,而我们理想的话是一条。
可以看到,两次 put 的 hash 值并不相同,导致键在 Entry 数组中的位置 i 也不同,因而会有两条记录。
put方法中调用的hash(key)会使用people类中的hashcode方法,如果没有重写就会使用默认的方法,即根据地址给出hash值,而我们new的两个对象地址肯定不一样,所以得到的值就不一样,所以我们需要自己重写hashcode
一般都是重写equals和hashcode一起。

之所以要考虑equals和hashcode就是因为集合类中的元素比较,去重就会用到这两个方法。