为什么在重写equals()方法时,一般都会重写HashCode()方法?

重写equals()方法主要是为了方便比较两个对象内容是否相等。hashCode()方法用于返回调用该方法的对象的散列码值,此方法将返回整数形式的散列码值。
一个类如果重写了 equals()方法,通常也有必要重写 hashCode()方法,目的是为了维护hashCode()方法的常规协定,该协定声明相等对象必须具有相等的散列码。hashCode 的常规协定主要有以下几点。
□ 在 Java 应用程序执行期间,在同一对象上多次调用 hashCode()方法时,必须一致地返回相同的整数,前提是对象上 equals()方法比较中所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
□ 如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode()方法都必须生成相同的整数结果。
□ 以下情况不是必须的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode()方法必定会生成不同的整数结果。但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高散列表的性能。
实际上,由 Object 类定义的 hashCode()方法确实会针对不同的对象返回不同的整数。(通常是通过将该对象的内部地址转换成一个整数来实现的,但是Java编程语言不需要这种实现技巧。)
注意:相等的对象必须有相同的散列码,反之散列码相同则不一定对象相等,而且不相等的对象并不一定需要有不同的散列码。
基于散列法的集合需要使用 hashCode()方法返回的散列码值存储和管理元素,例如Hashtable、HashMap和HashSet等,在使用这些集合时,首先会根据元素对象的散列码值确定其存储位置,然后再根据equals()方法结果判断元素对象是否已存在,最后根据判断结果执行不同处理。因此,实际应用时如果重写了equals()方法,那么hashCode()方法也会被重写。

猜你喜欢

转载自blog.csdn.net/weixin_42470710/article/details/85934416