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

在这种情况下,
- 有一个包含 256 个存储桶的数组(当然,编号为 0-255)
- 有五个人。它们的哈希码在通过后指向数组中的四个不同插槽。
mod 256
- 你可以看到桑德拉·迪(Sandra Dee)没有空位,所以她一直被约翰·史密斯(John Smith)锁链锁住。
现在,如果你试图查找Sandra Dee的电话号码,你会散列她的名字,按256修改,然后查看桶152。在那里,你会发现约翰·史密斯。那不是桑德拉,再看看...啊哈,有桑德拉被锁在约翰身后。