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