为什么重写equals还要重写hashcode

    xiaoxiao2022-07-14  170

    在定义的类重写equals方法的同时为什么一定要重写JDK本地的hashcode方法呢? 我们从两者的本质上出发去解决这个问题

    hashcode()方法时本地方法,返回的是对象的内存地址,object类的equals方法比较的就是对象的内存地址,所以说如果equals相等,说明两个对象的地址也相等; 反之,如果hashcode()的返回值相同,equals会是true吗?答案是不一定,原因;

    哈希码在生成的时候产生了冲突 反过来,hashcode不同,equals一定不同;

    hash算法对于查找元素提供了高效率;

    hash算法可以提高从集合中查找元素的效率,HashSet就是根据hash算法实现的,往HashSet中添加元素时,首先会调用元素的hashcode方法得到哈希值,然后通过元素的哈希值经过移位等运算,就可以得到该元素在哈希表(散列表)中的位置: 情况1: 如果算出元素存储的位置目前没有任何元素存储,那么该元素可以直接存储到该位置上。

    情况2: 如果算出该元素的存储位置目前已经存在有其他的元素了,那么会调用该元素的equals方法与该位置的元素再比较一次,如果equals返回的是true,那么该元素与这个位置上的元素就视为重复元素,不允许添加,如果equals方法返回的是false,那么该元素运行添加。

    HashSet集合存储对象的效率相对要低些,因为向HashSet集合中添加一个对象时,要先计算出对象的哈希码和根据这个哈希码确定对象在集合中的存放位置为了保证一个类的实例对象能在HashSet正常存储,要求这个类的两个实例对象用equals()方法比较的结果相等时,他们的哈希码也必须相等;也就是说,如果obj1.equals(obj2)的结果为true,那么以下表达式的结果也要为true: obj1.hashCode() == obj2.hashCode() 换句话说:当我们重写一个对象的equals方法,就必须重写他的hashCode方法,不过不重写他的hashCode方法的话,Object对象中的hashCode方法始终返回的是一个对象的hash地址,而这个地址是永远不相等的。所以这时候即使是重写了equals方法,也不会有特定的效果的,因为hashCode方法如果都不相等的话,就不会调用equals方法进行比较了,所以没有意义了。

    最新回复(0)