JAVA-equals与hashcode方法

时间:2022-08-19 16:47:48

先上结论,两个对象:

如果equals返回true,hashcode必定相等;

如果equals返回false,hashcode可能相等,也可能不等。

重写规则:如果重写equals()必须重写hashCode()方法。

(Eclipse提供了生成hashCode()和equals()的方法(source->generate...))

        hashcode的目的主要是减少equals的调用次数,减少查询时间(数据与存储地址关联)。

        JAVA中有一个集合类Set(或者叫容器whatever),实现数学意义的集合,元素不能重复,这是如何在JAVA中实现的呢?


        当向Set中插入一个元素的时候,首先会调用hashcode方法,这样就可以直接定位它所存储的位置,若该处没有其他元素,则直接保存。若该处已经有元素存在,就调用equals方法来匹配这两个元素是否相同,相同则不存,不同则散列到其他位置。这样处理,当我们存入大量元素时就可以大大减少调用equals()方法的次数,极大地提高了效率。

以下文字摘自JavaTM Platform Standard Ed. 6 Doc, Object类

尤其注意文档中这一句:

如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。
hashCode
public int hashCode()
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。
hashCode 的常规协定是:

在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)