equals() 方法和 hashcode() 方法简介

2019-05-25  本文已影响0人  最美的风景

Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码。equals()和hashCode()都不是final方法,都可以被重写(overwrite)。

equal()方法

Object类中equals()方法实现如下:

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

很明显是对两个对象的地址值进行的比较(即比较引用是否相同)。但是我们知道,String 、Math、Integer、Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法,是进行的内容比较,而已经不再是地址的比较。

虽然我们在定义类时,可以重写equals()方法,但是有一些注意事项;JDK中说明了实现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。

hashcode() 方法

Object类中hashCode()方法的声明如下:

public native int hashCode();

可以看出,hashCode()是一个native方法,而且返回值类型是整形;实际上,该native方法将对象在内存中的地址作为哈希码返回,可以保证不同对象的返回值不同。

hashCode()方法给对象返回一个hash code值,它的性质是:
1、hashCode()在哈希表中起作用,如java.util.HashMap。

2、如果对象在equals()中使用的信息都没有改变,那么hashCode()值始终不变。

3、如果两个对象使用equals()方法判断为相等,则hashCode()方法也应该相等。

4、如果两个对象使用equals()方法判断为不相等,则不要求hashCode()也必须不相等;但是开发人员应该认识到,不相等的对象产生不相同的hashCode可以提高哈希表的性能。

上一篇下一篇

猜你喜欢

热点阅读