hashCode() & equals()

Java Object 类的源码中 hashCode() 的注释写道:

  • 在Java程序运行中,不论调用多少次hashCode(),总是返回相同的整数,前提是没有修改equals()方法中用到的用来进行比较的值。
  • 在这次程序运行和下次程序运行中hashCode()返回的值不要求相同。
  • 如果两个对象根据equals方法是相等的,那么调用hashCode()方法也要返回相同的整数值。
  • 当两个对象根据equals方法是不相等的,不要求hashCode()方法返回不同的整数值。但返回不同的整数值可以提高hash table的效率。
    • 出于实用角度,Object类中的hashCode方法为不同对象返回不同整数值。(可能是根据对象的内存地址进行函数变换得到。)

equals方法的注释同样有很多信息:

equals()是用来实现一个非null引用相等关系的。

equals()的性质:

  • 自反性 reflexive

    对于非null引用值x,x.equals(x)总是返回true

  • 对称性 symmetric

    对于非null引用值x、y,x.equals(y)返回true当且仅当y.equals(x)返回true

  • 传递性 transitive

    对于非null引用值x、y、z,若x.equals(y)返回true且y.equals(z)返回true,则x.equals(z)应返回true

  • 一致性

    对于非null引用值x、y,对于x.equals(y),多次调用返回值应是相同的,前提是equal()中参与判断的依据值没改变

  • 非null性

    对于任何非null引用值x,x.equals(null)总应返回false

Object类的equals()方法实现了区分两个非null引用值x、y的方法,当且仅当x、y指向同一个对象,即x==y时返回true。

注意:一般重写了equals()方法就要重写hashCode()方法,进而来维持hashCode()的规范,hashCode()保证equal的对象有相同的hash code。


2019-11-9 14:36:34

更多:面试官爱问的equals与hashCode