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

2022-09-02 19:19:35

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

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


答案 1

其基本思想是这样的:HashMap

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

图片由维基百科提供: The graphics

在这种情况下,

  • 有一个包含 256 个存储桶的数组(当然,编号为 0-255)
  • 有五个人。它们的哈希码在通过后指向数组中的四个不同插槽。mod 256
  • 你可以看到桑德拉·迪(Sandra Dee)没有空位,所以她一直被约翰·史密斯(John Smith)锁链锁住。

现在,如果你试图查找Sandra Dee的电话号码,你会散列她的名字,按256修改,然后查看桶152。在那里,你会发现约翰·史密斯。那不是桑德拉,再看看...啊哈,有桑德拉被锁在约翰身后。


答案 2

这并不意味着像MD5这样的哈希技术。它是用于存储特定密钥的内存位置的哈希码HashObject

读数:

这是对HashMap如何工作的更清晰的解释?