1.我们想想,我们重写equals方法的目的是为了什么?
2.重写了equals方法后,保证了两个对象相等,那就一定保证这两个对象的hashCode相等吗?
3.我们重写了equals方法为什么还要重写hashCode?
回答1:我们重写equals方法不就是为了保证两个对象,在某些条件都相等情况下,心里默认这两个对象是相等的。例如String,不就是值相等,我们就判断其equals相等么
回答2:重写了equals方法保证了两个对象相等,但是,hashCode不一定相等。而java里面规定,两个对象相等,那么其hashCode一定相等。所以为了这个规范,我们要重写hashCode()方法。
回答3:为了避免在equals相等的条件下,出现hashCode值不相同的情况出现。所以我们在重写equals方法的同时要重写hashCode
补充:像我们常用的hashSet,hashMap,其都是根据hashCode值来判断是否相同的。
代码示例:
定义一个EqualExample类
public class EqualExample { private int x; private int y; private int z; public EqualExample(int x,int y,int z) { this.x = x; this.y = y; this.z = z; } //重写了equals方法 @Override public boolean equals(Object o) { if(this == o) return true; //检查是否是同一个对象引用 if(o == null || getClass() != o.getClass()) { return false;//如果不是同一个对象的引用,我们这里判断是否是同一个类型 } EqualExample that = (EqualExample) o;//进行转型 //比较判断每个关键域是否相等 if (x != that.x) return false; if (y != that.y) return false; return z == that.z; } //重写了hashCode方法 @Override public int hashCode() { int result = 17; result = 31 * result +x; result = 31 * result +y; result = 31 * result +z; return result; } }
定义测试类:
public class EqualsTest { public static void main(String[] args) { //新建了两个EqualExample对象,我们这里是希望这两个对象是一样的,但实际不一样 //因为我们没有重写hashCode方法 EqualExample e1 = new EqualExample(1,1,1); EqualExample e2 = new EqualExample(1,1,1); EqualsTest e3 = new EqualsTest(); EqualExample e4 = new EqualExample(2,1,1); System.out.println(e1.equals(e1));//true,原因是同一个对象引用 System.out.println(e1.equals(e3));//false,原因是不同类型的对象 System.out.println(e1.equals(e4));//false,原因是x值不同 System.out.println(e1.equals(e2));//true,原因是我们重写了equals方法 //假定我们这里认为这两个对象是相等的,我们想将这两个对象放到hashSet中 //没有重写hashCode之前 /*HashSet<EqualExample> hashSet = new HashSet<>(); hashSet.add(e1); hashSet.add(e2); System.out.println(hashSet.size());//2,原因是hashSet在add的时候,是根据HashCode来添加的,而这两个对象的hashCOde值不同,所以添加了两个 */ //重写了hashCode之后 //那么如何达到我们想要的结果呢? //解决方法:重写hashCode方法 HashSet<EqualExample> hashSet = new HashSet<>(); hashSet.add(e1); hashSet.add(e2); System.out.println(hashSet.size());//1,原因是我们重写了hashCode } }