为啥覆盖了equals()也必须覆盖hashcode()方法
为什么覆盖了equals()也必须覆盖hashcode()方法当我们重写了对象的equals方法,一般情况下(这里我指这些对
为什么覆盖了equals()也必须覆盖hashcode()方法
当我们重写了对象的equals方法,一般情况下(这里我指这些对象不需要放到Set或Map中仅仅是比较需要,或者虽然放到Set或Map中,但是get和set时用的是同一对象)是没有问题的,但是,有些情况下就不同了;举个例子:
public int hashCode() { return this.getId() * 37 ;} 重运行TestHashCode ;huh,我们想要的结果出现了,“aaa”
为什么,老早的时候我就问过自己,只怪自己不求甚解;其实很简单Map.put(key,value)时根据key.hashCode生成一个内部hash值,根据这个hash值将对象存放在一个table中Map.get(key)会比较key.hashCode和equals方法,当且仅当这两者相等时,才能正确定位到table。
回到先前的问题,为什么添加person.hashCode()前,得不到person对象;因为java中默认的hashCode是根据对象的地址计算得到的,虽然p1.equals(p2)=true,但是p1,p1有不同的内存地址,所以有不同的hashCode;所以通过p2是不能得到value的,这个时候value==null;添加hashCode()后,两个对象有相同hashCode,所以能得到。
java中Set是通过Map实现的,所以Map和Set的所有实现类都要注意这一点。
HashMap是通过链地址法解决hash collision的,并且新对象都是添加到表头的。