重写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,按照规范一定不会错的。