面试题练习——hashcode相等两个类一定相等吗?equals呢?相反呢
1.分析 hashcode 源码
hashcode()返回对象的哈希码值。比如java.util.HashMap提供的散列表
hashcode规则使用如下:
在Java应用程序执行期间多次对同一个对象调用hashCode方法时,只要没有修改在对象上的 equals 比较中使用的信息,该方法就必须一致地返回相同的整数。此整数不需要在应用程序的一次执行与同一应用程序的另一次执行之间保持一致。
如果两个对象根据 equals(Object) 方法是相等的,那么对这两个对象调用hashCode方法必须产生相同的整数结果。
如果根据{@link java.lang.Object# = (java.lang.Object)}方法两个对象不相等,则需要两个对象调用各自的{@code hashCode}方法必须产生不同的整数结果。然而,程序员应该知道产生不同的整数结果,可以提高散列表的性能。
由以上可知:
- 相同的对象必须具有相等的 hashcode
- equals相等的对象,hashcode也一定是相等的
- == 相等的对象,hashcode也一定是相等的
(以上是hashcode源码,当String、Integer等封装类在使用hashcode()方法时,已经覆盖了Object类的hashcode()方法 )
2.分析 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。
一致性(consistent)。对于任意不为null的引用值x和y,如果用于equals比较的对象信息没有被修改的话,多次调用时x.equals(y)要么一致地返回true要么一致地返回false。
对于任意不为null的引用值x,x.equals(null)返回false。
由以上可知:比较的是两个引用对象,即比较两个对象的地址值。
(但是,当String、Integer等封装类在使用equals()方法时,已经覆盖了Object类的equals()方法 。比较的是内容)
3.总结
综合以上分析:
equals相等的对象,hashcode也一定是相等的
== 相等的对象,hashcode也一定是相等的
反之则不一定。