一种常见的Java编程错误:没有同时定义equals()和hashCode()方法

前段时间出差了十几天,所以博客更新得有点慢了。

前几天看这篇论文:D. Hovemeyer and W. Pugh, "Finding bugs is easy," SIGPLAN Not., vol. 39, pp. 92-106, 2004. 介绍了Findbugs这种工具最初实现时能够检测的18种缺陷。一种有一种印象挺深的,这里总结一下:

Core Java Volume 1这本书在其197页也介绍到了这种规范,即如果在一个类中重新定义(重载)了equals()方法,那也必须同时定义(重载)hashCode()方法。由于在Object类中,hashCode()方法默认返回一个由虚拟机分配的任意值,如果仅仅定义了equals()方法,将导致两个相等的对象在一个哈希数据结构(如HashMapHashTable)中处于不同的位置。从而违反了哈希数据结构的语义。

所以,在对equals()hashCode()方法进行重载时,两者需要兼容。如果x.equals(y)返回true,那么x.hashCode()必须和y.hashCode()方法返回值相等。以Core Java这本书中为例,如果Employee.equals比较的是employee的ID,那么hashCode()方法也应该对employee的ID进行哈希(两个相等的String的哈希值是相等的)。

HashMap的使用方法:http://blog.csdn.net/devillyd/article/details/3135479

 

posted on 2012-05-06 21:41  qysh123  阅读(260)  评论(0编辑  收藏  举报

导航