网上看到那么一个问题,百度了一下没有找到合适的答案。。。求大神解释下。。。
JDK源码的注释说明的很清楚,如果重写了equal方法,也应该重写hashCode方法。看看源码注释吧,是非常好的文档资料呢。
*Note that it is generally necessary to override the hashCode
* method whenever this method is overridden, so as to maintain the
* general contract for the hashCode method, which states
* that equal objects must have equal hash codes.
http://blog.csdn.net/renfufei/article/details/16339351
简单来说一句话,HashCode相同未必相等,但是如果Hash不同,一定不相等。
不知道你听说过md5没有,它就是一种典型的hash算法。
我们用它加密密码。
用户输入密码,服务器转换为md5密文,和存在数据库中的比对,如果相同,就视作用户输入密码正确。
很显然,这个过程中用户输入的密码如果正确,只能得到唯一的md5。
但是理论上,用户输入一个错误的md5也可能因为算出的md5和预留的一致而被视作是正确的。这种情况称之为hash碰撞(也就是数据结构课程里说的hash冲突)
对照“HashCode相同未必相等,但是如果Hash不同,一定不相等”这个原则,我们很容易理解这一点。
hashcode其实是个每一个对象定义了一个散列值,从而保证每个对象都是唯一不同的
equals()方法与hashCode()方法的隐式调用时的约定是:
1.如果两个对象相等(equals),那么他们必须拥有相同的哈希吗(hashCode)
2.即使两个对象拥有相同的hashCode,他们也不一定相等.