为什么重写equals还要重写hashcode

Posted wrl123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么重写equals还要重写hashcode相关的知识,希望对你有一定的参考价值。

在Object类中equals方法如下:

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

对于引用类型的对象,比较的是两者的内存地址。而hashCode:返回的是对象的内存地址。

在Object类的hashcode()方法上写到:

1、在JAVA程序执行期间,同一对象多次调用hashcode方法时,应返回相同的整数,前提是该对象equals时所用的值未被修改。

2、如果两个对象equals(Object o)相等,那么它们的hashcode值也应该相同。

3、如果两个对象的equals(Object o)不相等,那么它们的hashcode方法所得到的的整数值不一定不同。  

 hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。如果我们将对象的equals方法重写而不重写hashcode,当我们再次new一个新的对象的时候,equals方法返回的是true,但是hashCode方法返回的就不一样了,如果需要将这些对象存储到结合中(比如:Set,Map ...)的时候就违背了原有集合的原则。

以上是关于为什么重写equals还要重写hashcode的主要内容,如果未能解决你的问题,请参考以下文章

为什么重写了equals(),还要重写hashCode()?

为什么重写equals还要重写hashcode

为什么重写equals还要重写hashcode

Java的hashCode和equals方法

重写了equals方法为何需要重写 hashCode

重写hashcode和equals怎么重写