散列与散列码
这看起来够简单了,但是它不工作——它无法找到数字3这个键。问题出在Groundhog自动地继承自基类Object,所以这里使用Object的hashCode()方法生成散列码与由Groundhog(3)生成的第二个实例的散列码是不同的,而我们正是使用后者进行查找的。
可能你会认为,只需编写恰当的hashCode()方法的覆盖版本即可。但是它仍然无法正常运行,除非你同时覆盖equals()方法,它也是Object的一部分。HashMap使用equals()
判断当前的键是否与表中存在的键相同。
正确的equals()方法必须满足下列5个条件:
1)自反性。对任意x,x.equals(x)一定返回true;
2)对称性。对任意x和y,如果y.equals(x)返回true,则x.equals(y)也返回true。
3)传递性。对任意x、y、z,如果有x.equals(y)返回true,y.equals(x)返回true,则x.equals(z)一定返回true。
4)一致性。对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回的结构应该保持一致,要么一直是true,要么一直是false。
5)对任何不适null的x,x.equals(null)一定返回false。
再次强调,默认的Object.equals()只是比较对象的地址,所以一个Groundhog(3)并不等于另一个Groundhog(3)。因此,如果要使用自己作为HashMap的键,必须同时
重载hashCode()和equals()。