在java中映射和设置

时间:2014-03-19 18:52:27

标签: java

我了解收藏品。但我在想,当我们覆盖地图中的键时,它只是覆盖了分配给它的先前值。

在另一方面,我们说当我们在map中放入值时,它调用hashcode(),如果它转到同一个桶,则调用equal()。如果没有,则不需要调用equal()方法。

如果是这样的话,当我们在hashmap中覆盖键时。它可能调用hashcode(),就像为键/值对返回相同的哈希码一样。然后调用相等并且在检查它完全相同之后,为什么它会被覆盖?

1 个答案:

答案 0 :(得分:0)

HashMap(和地图实现)不会对值调用hashCode()方法 - 它们在键上调用。执行检查以查看密钥是否为空 - 如果是这种情况,则不调用hashCode()并且密钥存储在映射表中的位置0。

在键上调用哈希函数。我们都知道地图以恒定时间O(1)检索元素。现在出现了一个有趣的部分 - 密钥的哈希码并不总是解析为唯一值。当条目数量很大时,java中的HashMap应用另一个散列函数来调整地图结构的大小,但这不能无限制地完成。在某个时刻,多个密钥将解析为相同的值。在这种情况下,当多个键被散列到同一个桶(映射结构中的位置)时,通过将元素存储为链接列表来解决冲突(这种情况很少发生)。现在,进入指向链表的存储桶的元素的查找时间是线性的(O(n))。