Java 对象 覆盖equals时总要覆盖hashCode

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 对象 覆盖equals时总要覆盖hashCode相关的知识,希望对你有一定的参考价值。

  在每个覆盖了equals方法的类中,也必须覆盖hashCode方法。

 

  hashCode的通用约定:

  1 在程序的执行过程中,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一个对象调用多次,hashCode方法必须始终如一地返回同一个整数。

  2 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果。

  3 如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中任意一个对象的hashCode方法,则不一定要产生不同的整数结果。给不相等的对象产生不同的整数结果,可以提高散列表的性能。

  因没有覆盖hashCode而违反的关键约定是第2条:相等的对象必须具有相等的散列码(hash code)。由于类没有覆盖hashCode方法,两个相等的实例调用hashCode方法返回的整数可能不相等。

  

  一个好的散列函数为不相等的对象产生不相等的散列码。理想情况下,散列函数应该把集合中不相等的实例均匀地分布到所有可能的散列值上。31可用移位和减法来代替乘法,可以得到更好的性能:31*i==(i<<5)-i。

 

  参考资料

  《Effective Java 中文版 第2版》 第9条:覆盖equals时总要覆盖hashCode P39-43

以上是关于Java 对象 覆盖equals时总要覆盖hashCode的主要内容,如果未能解决你的问题,请参考以下文章

覆盖equals时总要覆盖hashCode

Effective Java 第九条:覆盖equals时总要覆盖hashCode

Effective Java5覆盖equals时总要覆盖hashcode

第9条:覆盖equals时总要覆盖hashCode

effectiveJava覆盖equals时总要覆盖hashcode

覆盖equals时总要覆盖hashCode