购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

陷阱20

各负其责
——重写equals方法但是没有重写hashCode方法

在程序开发的过程中,有时需要重写对象的equals方法,但是在重写对象的equals方法时,一定要记得重写对象的hashCode方法,因为在解决一些特殊问题时,需要应用对象的散列码,例如,当判断某个HashSet集合中是否包含某个对象时,就要用到对象的散列码,如果两个对象的散列码不同,就认为它们是不同的对象。

下面看一个由于重写对象的equals方法而没有重写hashCode方法,导致程序判断集合中是否包含指定对象出错的实例。

例3.20.1 创建类,在该类中重写equals方法,然后创建该类的两个实例,将其中一个实例放到HashSet集合中,并判断该集合中是否包含另一个对象。(光盘位置:光盘\MR\Instance\3\20\RewriteMethodApp)

运行本实例,程序将输出如图3.19 所示的信息。

图3.19 没有重写hashCode方法输出的信息

说 明

从图3.19 的①和②可以看出,本实例输出Book类的两个实例book1 和book2 的散列码值是不同的,它们的散列码值分别为11077203和 14576877,因此虽然book1 和book2 都是通过图书类型“IT”和图书名称“Java”创建的,但是由于它们的散列码值不同,所以从③处可以看出,在添加了book1 的Set集合中判断是否包含book2 时,输出了假值false,表示集合中不包含对象book2。

下面看一个在重写对象的equals方法的同时,也重写了hashCode方法,使程序能够正确判断集合中是否包含指定对象的实例。

例3.20.2 创建类,在该类中重写对象的equals方法和hashCode方法,然后创建该类的两个实例,将其中一个实例放到HashSet集合中,并判断该集合中是否包含另一个对象。(光盘位置:光盘\MR\ Instance\3\20\RewriteTwoMethodApp)

运行本实例,由于重写equals方法的同时重写了hashCode方法,所以程序将输出如图3.20 所示的信息。

图3.20 重写hashCode方法之后输出的信息

说 明

从图3.20 的①和②可以看出,Book类的两个实例book1 和book2 的散列码值都是71349994,即它们的散列码值是相同的,因此对于通过图书类型“IT”和图书名称“Java”创建的两个对象book1 和book2 代表相同的对象,所以从图中的③处可以看出,在添加了book1 的Set集合中判断是否包含book2 时,输出了真值true,表示集合中包含了对象book2。 2n+vontvbJfH9u9VKPSebaLhYs0DQiiWt9dpcZJEu5t/cHHM6YBpeGkif8ybkb9Z

点击中间区域
呼出菜单
上一章
目录
下一章
×