一分钟理解equals和hashCode的关系
首先我们来了解一下hashCode
hashCode()的作用:是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode()函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码(可以快速找到所需要的对象)
提问:重写了equals一定要重写hashCode方法吗?
答:一定要重写,因为集合判断一个元素是否已经存在就是通过hashCode来判断的,如果重写了equals而没有重写hashCode会导致集合元素找不到而永久丢失。
举例:
我们就以HashMap的数据插入原理来说:
1.判断数组是否为空,为空进行初始化;
2.不为空,计算 k 的 hash 值,通过(n - 1) & hash计算应当存放在数组中的下标 index;
3.查看 table[index] 是否存在数据,没有数据就构造一个Node节点存放在 table[index] 中;
4.存在数据,说明发生了hash冲突(存在二个节点key的hash值一样), 通过equals继续判断key是否相等,相等,用新的value替换原数据(onlyIfAbsent为false);
两者关系:
- 如果equals相等,则hashcode一定也是相同的
- 两个对象的hashcode值相同,equals不一定是相等的