重写了equals()就必须要重写hashCode()的原因。

    科技2022-07-14  120

    重写了equals()就必须要重写hashCode()的原因:

    首先java里面有集合,如hashmap,hashset等。相信都用过HashMap。根据key,可取value值。key不能重复,value可以重复是他的特点。说明key 是唯一的。

    然后你为何要重写了equals()呢?是默认的equals()方法不符合你的要求,你自定义在某种情况下,对象Object的equals是true的。

    那就会出现下面这种情况。

    public class t { public static void main(String[] args){ HashMap hashMap = new HashMap(); hashMap.put(new user5("mary"),"mary:50Kg"); hashMap.put(new user5("mary"),"mary:100000Kg"); System.out.println(hashMap.keySet()); System.out.println(new user5("mary").equals(new user5("mary")));//true System.out.println(hashMap.get(new user5("mary"))); //null } } class user5 { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "user{" + "name='" + name + '\'' + '}'; } public user5(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; user5 user5 = (user5) o; return Objects.equals(name, user5.name); } // @Override // public int hashCode() { // return Objects.hash(name); // } }

    输出结果

    [user{name='mary'}, user{name='mary'}] true null

    这就有种违和感,你重写了equals()方法让他们‘相等’,但是在HashMap中key就‘重复’了。

    造成这种状况的原因是,没new一个对象,他的hashcode值是不一样的。HashMap是根据hashcode来计算key的位置,即重复与否的。

    把上述代码中的重写hashcode的返回发打开的结构。

    [user{name='mary'}] true mary:100000Kg。

     

    Processed: 0.012, SQL: 8