我已经阅读了该主题中的所有帖子,但我仍然对以下内容感到困惑:何时会发生覆盖和碰撞?从我读过的内容来看:
- 只要两个对象在
equals()
方法方面相同,它们的散列码必须相同 - 每当两个对象在
equals()
方法方面不相同时,我们无法保证它们的idhashcode()
,即它可能相同,它可能不一样 - 当我们使用
HashMap.put(key, value)
时,HashMap 通过它们的equal()
方法比较对象。如果两个键是equal()
则新的value
被overriden - 如果两个 kays 有相同的
hashcode
就会发生冲突,Java 会处理它 - 但是如果两个键相等则新值被覆盖,但这也意味着
hashCode()
必须相同,因此必然发生碰撞,这与前面矛盾吗?
有人可以为我阐明这些步骤吗?
最佳答案
将 HashMap 想象成一组鸽子洞。每个鸽子洞可以容纳不止一件元素。
hashCode()
返回值用于选择包含或将包含该对象的鸽子洞。
equals()
用作识别特定对象的标准(例如,用于替换)。
hashCode()
的目的是将典型对象均匀地分散在鸽子洞中。一旦一个特定的鸽子洞被识别为可能包含一个对象,那么必须检查该特定组中的所有对象。该操作开销很大,因为需要调用 equals()
。
关于java - 与 Java 中的 hashmap 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24930086/