【问题标题】:Mechanism of Java HashMapJava HashMap的机制
【发布时间】:2014-05-20 13:49:19
【问题描述】:
  1. Algorithms的书,需要掌握hashtable的概念。他们写了关于使用单独链接的散列和使用线性探测的散列。我猜 Java 的 HashMap 是一个哈希表,所以我想知道 HashMap 使用什么机制(链接或探测)?

  2. 我需要用 get、put、remove 实现最简单的 HashMap。你能指点我阅读的好材料吗?

  3. 当 Map 使用的唯一键是自定义对象时,我们需要在对应类型内部实现 hashCode() 函数。我做对了吗?或者什么时候需要 hashCode()?

很遗憾,这本书并没有回答所有问题,尽管我知道对你们中的许多人来说这些问题都是低级的。

【问题讨论】:

  • 从技术上讲,Java 有一个内置的hashCode() 方法,但对于大多数用途,您在#3 中的评估是正确的。
  • 顺便说一句;您是否知道 Netbeans 在其中提供了 HashMap 的源代码(与编译后的字节码相反),因此您可以在其中四处寻找(可能也可以在 Internet 上找到,但在 IDE 中导航代码要好得多)
  • 是的,我可以访问 java.util.HashMap 代码,但我需要一个玩具示例,例如解释 15 岁的 Stack 或 Deque。

标签: java hashmap hashcode


【解决方案1】:

1:在 java 1.8 之前,HashMap 使用带有链表的单独链接来解决冲突。每个桶都有一个链表。

2: 嗯嗯嗯也许this 一个?

3:是的,你说的没错,hashCode() 是用来计算 Key 的 hash 的。然后哈希码将被转换为一个介于 0 和桶数 - 1 之间的数字。

【讨论】:

  • 链表只用于少量的冲突。如果碰撞次数太大(并且键可比较),则使用红黑树。
  • 请注意,在 Java 1.8 中,链表不再用于解决冲突。而是使用平衡树,请参阅:openjdk.java.net/jeps/180
  • @PhilippeMarschall 这仅在 Java 1.8 中是正确的。
  • 3.准确地说:介于 0 和桶数之间 - 1 :)
【解决方案2】:

这是我们许多人在面试中最困惑的问题。但它并不复杂。


我们知道

  • HashMap在Map.Entry中存储键值对(我们都知道)

  • HashMap 工作于哈希算法,在 put() 和 get() 方法中使用 hashCode() 和 equals() 方法。(即使我们知道这一点)

    李>
  • When we call put method by passing key-value pair, HashMap uses Key **hashCode()** with hashing to **find out the index** to store the key-value pair. (this is important)

  • The Entry is **stored in the LinkedList**, so if there are already existing entry, it uses **equals() method to check if the passed key already exists** (even this is important)

  • 如果是,它会覆盖值,否则它会创建一个新条目并存储此键值条目。

  • 当我们通过传递 Key 调用 get 方法 时,它再次使用 hashCode() 查找数组中的索引,然后使用 equals () 方法来找到正确的条目并返回它的值。 (现在这很明显)

这张图片将帮助您理解:

【讨论】:

    【解决方案3】:

    HashMap 的工作原理是 Hashing。它的工作是双重的。

    首先,它维护一个链表来存储具有相似值的对象,即“相等”的对象。

    其次,它具有这些链表的集合,其标题存在于数组中。

    更多信息请参考博客Java Collection Internal Working

    【讨论】:

      猜你喜欢
      • 2013-03-04
      • 2012-04-22
      • 1970-01-01
      • 2012-08-12
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-27
      • 2011-08-01
      相关资源
      最近更新 更多