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可以提高哈希表的性能。
网友评论