重写equals为何要重写hashcode

比较对象,由于所有 的对象超类都是java.lang.Object,所以都是比较的类在堆里面分配的内存地址,即时对象的属性都是一样的,实际上equals之后也是false,Object.equals方法如下:

    public boolean equals(Object obj) {
        return (this == obj); //比较的是内存里的地址,而不是具体的值
    }

 

标题里说重写equals为何要重写hashcode,是因为一旦对象如果用hashMap、hashSet这样的哈希桶作为key存储的话,putVal(对象,具体值)的时候,如果没有重写hashcode,实际上哈希桶里面是保存的是两份数据,同样的,如果重写hashcode不重写equals,putVal的时候也会当作不同的key来存储

        map.put(new Student(1,"张三"),3000);
        map.put(new Student(1,"张三"),5000);

 

所以阿里巴巴手册里说要重写hashcode一定要重写equals,按照规范一定不会错的。

 

posted @ 2020-05-31 18:34  feibazhf  阅读(175)  评论(0)    收藏  举报