Java `HashMap` 中 `equals` 相等但 `hashCode` 不相等的对象会产生什么后果:说明哈希容器定位与键契约的准确关系
进阶版来源:alibaba高级工程师可变对象作为键哈希集合失效HashMap键值语义equals与hashCode契约
草稿
答案解析
在 Java 的 HashMap 里,如果两个对象 equals 判断相等,但是 hashCode 不相等,会破坏 HashMap 对 key 的基本约定,直接后果就是:逻辑上相等的 key 可能被当成两个不同的 key 存进去,或者用一个等价对象去查找时查不到原来的值。
HashMap 的查找过程大概是这样的:
1. 先根据 key 的 hashCode() 计算 hash 值; 2. 再根据 hash 值定位到数组下标,也就是 bucket; 3. 如果这个 bucket 上有元素,再逐个比较:先比较 hash 是否相等,再用 equals 判断 key 是否相等。
也就是说,equals 并不是第一步,它只会在 hash 定位到同一个桶之后才有机会参与比较。
举个例子:
如果执行:
``
登录后查看完整内容
