HashTable和HashMap键值如何存储在内存中?

时间:2012-06-05 09:12:15

标签: java hashmap hashtable

我知道有一种哈希技术应用于密钥以将其值存储在内存地址中。

但我不明白碰撞是如何发生的 Java使用哪种哈希算法来创建内存空间?是MD5吗?

4 个答案:

答案 0 :(得分:28)

HashMap的基本理念是:

  1. HashMap实际上是一组包含Key和Value的特殊对象。
  2. 阵列有一些桶(插槽),比如16。
  3. 散列算法由每个对象具有的hashCode()方法提供。因此,在编写新的Class时,您应该注意正确的hashCode()equals()方法实现。默认值(Object类)将内存指针作为数字。但这对我们想要使用的大多数类都不好。例如,String类使用一种算法来生成字符串中所有字符的哈希值 - 想象如下:hashCode = 1.char + 2.char + 3.char...(简化)。因此,两个相等的字符串,即使它们位于内存中的不同位置,也具有相同的hashCode()
  4. hashCode()的结果,比如说“132”,那么如果我们有一个大的数组,那么应该存储对象的存储桶数量。但我们没有,我们的只有16桶。因此,我们使用明显的计算'hashcode % array.length = bucket''132 mod 16 = 4',并将键值对存储在4号桶中。
    • 如果还没有其他配对,那没关系。
    • 如果有一个Key等于我们拥有的Key,我们会删除旧的。
    • 如果还有另一个Key-Value对(碰撞),我们会将旧的一对键链接到一个链表。
  5. 如果支持数组太满,那么我们必须创建太多的链表,我们创建一个双倍长度的新数组,重新散列所有元素并将它们添加到新数组中,然后我们处理旧数组。这很可能是HashMap上最昂贵的操作,所以如果你以前知道它,你想告诉你Maps你将使用多少桶。
  6. 如果有人试图获取一个值,他会提供一个密钥,我们将其哈希,修改它,然后通过潜在的链表进行完全匹配。
  7. An image, courtesy of Wikipedia: The graphics

    在这种情况下,

    • 有一个包含256个桶的数组(编号,当然是0-255)
    • 有五个人。它们的哈希码在通过mod 256后,指向数组中的四个不同的插槽。
    • 你可以看到Sandra Dee没有免费插槽,所以她被约翰史密斯束缚了。

    现在,如果您试图查找Sandra Dee的电话号码,您可以将她的名字哈希,将其修改为256,然后查看存储桶152.在那里您可以找到John Smith。那不是桑德拉,再看看......啊哈,桑德拉在约翰之后被锁住了。

答案 1 :(得分:3)

此处Hash并不代表HashingMD5技术。它是HashCode内存位置,用于存储特定键的Object

读数:

This对HashMap如何运作有更清晰的解释?

答案 2 :(得分:1)

作为hashCode()类中的默认实现Object函数,返回内存地址作为在HashTable&中用作键的哈希值。 HashMap

答案 3 :(得分:0)

经过@Slanec的回答后,确实看到了Java-8中的javadoc,因为有重大变化。例如:'TREEIFY',其中LinkedList转换为TreeMap,以防达到每个桶的阈值条目数(当前为8)。