java - 与 Java 中的 hashmap 混淆?

标签 java hashmap hashtable

我已经阅读了该主题中的所有帖子,但我仍然对以下内容感到困惑:何时会发生覆盖和碰撞?从我读过的内容来看:

  • 只要两个对象在equals() 方法方面相同,它们的散列码必须相同
  • 每当两个对象在equals() 方法方面不相同时,我们无法保证它们的id hashcode(),即它可能相同,它可能不一样
  • 当我们使用 HashMap.put(key, value) 时,HashMap 通过它们的 equal() 方法比较对象。如果两个键是 equal() 则新的 valueoverriden
  • 如果两个 kays 有相同的 hashcode 就会发生冲突,Java 会处理它
  • 但是如果两个键相等则新值被覆盖,但这也意味着 hashCode() 必须相同,因此必然发生碰撞,这与前面矛盾吗?

有人可以为我阐明这些步骤吗?

最佳答案

将 HashMap 想象成一组鸽子洞。每个鸽子洞可以容纳不止一件元素。

hashCode() 返回值用于选择包含或将包含该对象的鸽子洞。

equals() 用作识别特定对象的标准(例如,用于替换)。

hashCode() 的目的是将典型对象均匀地分散在鸽子洞中。一旦一个特定的鸽子洞被识别为可能包含一个对象,那么必须检查该特定组中的所有对象。该操作开销很大,因为需要调用 equals()

关于java - 与 Java 中的 hashmap 混淆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24930086/

相关文章:

java - 有没有可能直接在jvm中实现java应用的一部分?

java - 员工商店的编辑方法。(使用Hashmap)

java - 我们可以使用 size 和 for 循环遍历 map 吗

哈希表 : why buckets?

javascript - 将变量取消引用为其值以在另一个函数javascript中使用

java - 哈希表查找负载

java - 如何使用 "x <= y && x >= y && x != y"使循环无限?

java - JPA 字段名称大小写与 JSON 字段名称不匹配

java - MySQL、Java – 错误

java - 当 HashMap 的初始容量不是 2 的幂时指定它是否比根本不指定更好?