Object中的equals是通过比较两个对象的内存地址来判断其真假的。而原始的Hashcode方法返回的是对象的内存地址由哈希算法转换成一个整数。那么当equals判断两个对象相等时,他们的hashcode一定也相等。
在Hashset集合方法中如果我们想实现以下操作
package com.kui.Set01;
import java.util.HashSet;
public class Hashset1 {
public static void main(String[] args) {
HashSet<man> iss = new HashSet<>();
man s1 = new man("yuan");
man s2 = new man("jia");
man s3 = new man("po");
iss.add(s1);
iss.add(s2);
iss.add(s3);
iss.add(new man("yuan"));
}
}
任务:我想让iss.add(new man("yuan"));里面的对象与我们的s1这个对象完全相等而使得让add方法认为其重复无法加入到集合当中。
那么我们必须要重写Hashcode和equals这两个方法才能满足。
原因是因为当我们没有重写hashcode而只重写equals时,此时由于hashset是先通过判断两个对象的hashcode是否一样来规定你的数组存放位置进而执行去重操作,那么这里的hashcode显然是不一样的,因为我们没有重写hashcode,两个对象的内存地址不同,那么两个对象hashcode就不同。这时就有可能使你的这两个对象在数组中的存放位置不同。此时equals虽然判断两个对象相等但是hashset由于你存放的数组位置不同不会执行去重操作,然后直接一起加入进去。
同样的,当我们没有重写equals而只重写hashcode时,此时hashset先判断两个对象hashcode相等那么加入到数组同一位置再进行下一步判断,就是equals判断,这里equals判断绝对是不相等的然后就加入进去了。因为虽然你现在两个对象hashcode相等,但是我们equals是通过两个对象的内存地址来判断这两个对象是否相等的。你hashcode原来是通过对象的内存地址由哈希算法转换,所以你原来可能会误以为是equals用了hashcode这串数字来进行判断。现在重写的hashcode则是通过对象名字的哈希值来定。于是你发现判断不相等。也就是说你重写这个hashcode不会影响equals的判断,所以equals判断两个对象内存地址不相等就给他加入进去了。
得出结论,必须要重写Hashcode和equals这两个方法才能满足。