Object类的equals方法与hashcode方法分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/myNameIssls/article/details/80928766

Object类的equals方法与hashcode方法分析

equals

源代码

public boolean equals(Object obj) {
   return (this == obj);
}

概述

指示其他对象是否等同于这个对象。
equals方法在非空对象引用上实现等价关系:

  • 自反性:对于任意非空引用值x,x.equals(x)会返回true
  • 对称性:对于任意非空引用值x和y, x.equals(y)返回true, y.equals(x)也返回true
  • 传递性:对于任意非空引用值x,y和z,如果x.equals(y)返回true, 且y.equals(z)返回true, 那么x.equals(z)也返回true
  • 一致性:对于任意非空引用值x和y, 多次调用x.equals(y),要么一致的返回true,要么一致的返回false
  • 对于任意非空引用值x,x.equals(null)返回false。

Object类的equals()方法在对象比较上实现最为可能性的等同关系。即,对于任意对于任意非空引用值x和y,当且仅当x和y引用同一个对象时(x == y返回true)返回true。

注意,每当equals()被重写时,hashCode()方法也需要被重写。所以为了维护hashCode()方法的契约,以equals()方法声明的相同对象必须拥有相同的哈希码(散列值)

hashCode

源代码

public native int hashCode();

概述

返回一个对象的哈希码。这个方法支持哈希表的好外,例如HashMap

hashCode的契约如下:
1. 每当在Java应用程序的执行过程中多次调用这个方法时,hashCode方法必须返回相同的整数。在对象的equals比较中没有提供任何信息被修改。在一个应用程序的执行过程到相同程序的另一个执行过程中,这个整数不需要保持一致。
2. 如果两个对象通过equals(Object)方法比较结果相等,那么在两个对象上调用hashCode方法生成的哈希码必须相同。
3. 如果两个对象通过equals(Object)方法比较结果不相等,那么在两个对象上调用hashCode方法生成的哈希码也没有必要相同。但是,程序员应该知道,为不相等的对象生成不同的整数结果可以提高哈希表的性能。

只要是合理可行的,通过Object类定义的hashCode方法会为不同的对象生成不同的哈希码。(这通常通过把一个对象的内存地址转换成一个哈希码来实现,但是这种实现技术并不需要是由Java语言来实现)

参考链接:
https://docs.oracle.com/javase/8/docs/api/

展开阅读全文

没有更多推荐了,返回首页