散列与散列码

  这看起来够简单了,但是它不工作——它无法找到数字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()。

posted @ 2016-05-09 16:35  Friday92  阅读(246)  评论(0编辑  收藏  举报