如果一个类A我们通过它生成三个对象
A a1=new A(3,4);
A a2=new A(1,2);
A a3=new A(1,2);
如果我们要比较这三个对象是否相等,肯定得重写equals方法,然后依次比较里面的成员是否相等。只重写equals方法的话我们会得到
a1.equals(a2); //为false
a2.equals(a3); //为true
这里都没有问题,但是当我们用HashMap以A对象为key存放值时
HashMap<A,Integer> map=new HashMap<>();
map.put(a1,111);
map.put(a2,222);
map.put(a3,333);
理论上我们得到的map应该只有两个值,因为a2和a3两个key是一样的,后面添加的333会改变前面的222。所以map.size()为2,map.get(a2)=333,map.get(a3)=333;然而A类在没有重写hashcode方法的情况下并不是这样的结果,map.size()=3,map.get(a2)=222,map.get(a3)=333。说明在HashMap里a2和a3还是不一样的对象,因为在HashMap里比较key是否相等要同时比较equals和hashcode两个方法,而A类默认的hashcode方法是继承自Object类的,它比较的是默认的内存地址,显然a2和a3是两个对象,内存地址肯定是不一样的,所以要重写hashcode不要比较对象的内存地址而是对象的hashcode值,hashcode值的计算一般是通过A对象里的成员的值计算得到的,只要a2,a3成员相同,其hashcode值就相同。
所以重写hashcode是为了在用HashMap以对象为key时,两个有相同成员的对象能当作同一个key处理。