Java equal 和 hashcode

1、public boolean equals​(Object obj)

指示某个其他对象是否“等于”这个对象。
equals方法实现了非空对象引用的等价关系:

  • It is reflexive(反身的):对于任何非空的引用值x, x.equals(x)应该返回true。
  • 对称性(symmetric):对于任何非空的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)返回true。
  • 传递性(transitive):对于任何非空的引用值x、y和z,如果x.equals(y)返回true,而y.equals(z)返回true,那么x.equals(z)应该返回true。
  • 一致性(consistent):对于任何非空引用值x和y,如果未修改对象的equals比较中使用的信息,则多次调用x.equals(y)始终返回true或始终返回false。
  • 对于任何非空的引用值x, x.equals(null)应该返回false。

类对象的equals方法实现了对对象尽可能区别的等价关系;也就是说,对于任何非空的参考值x和y,当且仅当x和y指向相同的对象时,该方法返回true (x == y的值为true)。

请注意,通常需要在重写hashCode方法时重写该方法,以便维护hashCode方法的常规契约,该契约规定相等的对象必须具有相等的hash code。

2、public int hashCode()

返回对象的哈希码值。支持此方法的好处是可以使用HashMap提供的散列表
hashcode 的一般规约:

  • 在Java应用程序的执行过程中,无论何时在同一个对象上多次调用它,hashCode方法都必须一致地返回相同的整数,前提是不对对象上的equals比较中使用的信息进行修改。此整数不需要在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。
  • 如果根据equals(Object)方法,两个对象是相等的,那么在每个对象上调用hashCode方法必须产生相同的整数结果。
  • 如果两个对象根据equals(java.lang.Object)方法是不相等的,那么不一定在每个对象上调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
    在合理的实践范围内,类对象定义的hashCode方法为不同的对象返回不同的整数。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章