关于hashCode和equals

在Object类中,有hashCode()和equals()方法,而任何类都是Object的子类,同样也继承了这两个方法。

调用hashCode方法得到一个Int类型的哈希码,这个哈希码的作用是确定该对象在哈希表中的索引位置。而equals是比较两个对象的地址是否相等。顺便提一下,基本数据类型是存在虚拟机栈中的局部变量表里面,而对象存在堆中。

基本数据类型中Int、String、Double...都覆写了equals方法,目的是为了比较两个对象的内容是否相等,所以这些数据类型比较的是内容,不同于没覆写equals的对象比较两个对象的内存地址。

那么hashCode和equals的区别在于,hashCode得到的是一个Int类型的哈希码,而equals得到的是两个对象地址比较的Boolean值。

那么hashCode和equals又有什么联系呢?

其实一般情况下都不会有什么联系,hashCode得到一个Int值,equals得到一个Boolean值,两个不同类型的值一般情况下都不会有联系。

那么什么情况下才有联系呢?

当我们在使用HashMap、HashSet...散列表时(存储对象的集合,涉及到hashCode,附上HashMap的源码解析),存储需要用到hashCode去做索引。

在散列表中,比较两个对象是否相等,首先判断两个对象的hashCode是否相等,如果相等,那么继续判断两个对象的内容是否相等,如果对象不相等,那么就equals为false。

所以得到一个结论:两个对象相等时,hashCode一定相等;hashCode相等,两个对象不一定相等。

有了上面的理解,再来看看重写equals方法时为什么要重写hashCode方法?

在散列表中,如果重写equals方法,为了比较两个对象是否相等而不是内存地址,则必须重写hashCode方法。不重写hashCode方法会导致两个对象内容相等,但是hashCode不相等的情况,由于散列表中先比较hashCode在比较内容,当hashCode不相等时,两个对象必定不相等。

你可能感兴趣的:(关于hashCode和equals)