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语言来实现)

本文详细解析了Java中Object类的equals方法与hashCode方法的工作原理及其实现细节,阐述了两者之间的关系及其在实际开发中的应用。
1万+

被折叠的 条评论
为什么被折叠?



