📅  最后修改于: 2020-10-12 10:06:40             🧑  作者: Mango
这是将对象转换为整数值的过程。整数值有助于索引编制和更快的搜索。
HashMap是Java收集框架的一部分。它使用一种称为哈希的技术。它实现了map接口。它将数据存储在“键和值”对中。 HashMap包含节点的数组,并且该节点表示为一个类。它在内部使用数组和LinkedList数据结构存储键和值。 HashMap中有四个字段。
在了解HashMap的内部工作之前,您必须了解hashCode()和equals()方法。
我们使用put()方法在HashMap中插入键和值对。 HashMap的默认大小为16(0到15)。
在下面的示例中,我们想在HashMap中插入三个(键,值)对。
HashMap map = new HashMap<>();
map.put("Aman", 19);
map.put("Sunny", 29);
map.put("Ritesh", 39);
让我们看一下键值对将在哪个索引处保存到HashMap中。当我们调用put()方法时,它将计算键“ Aman”的哈希码。假设“ Aman”的哈希码为2657860。要将Key存储在内存中,我们必须计算索引。
索引使阵列的大小最小化。计算指标的公式为:
Index = hashcode(Key) & (n-1)
其中n是数组的大小。因此,“ Aman”的索引值为:
Index = 2657860 & (16-1) = 4
值4是计算出的索引值,其中的键和值将存储在HashMap中。
当两个或多个键的计算索引值相同时,就是这种情况。让我们计算另一个键“ Sunny”的哈希码。假设“ Sunny”的哈希码为63281940。要将Key存储在内存中,我们必须使用索引公式来计算索引。
Index=63281940 & (16-1) = 4
值4是计算得出的索引值,密钥将存储在HashMap中。在这种情况下,equals()方法检查两个Key是否相等。如果键相同,则用当前值替换该值。否则,通过LinkedList将此节点对象连接到现有的节点对象。因此,两个密钥将存储在索引4中。
同样,我们将存储密钥“ Ritesh”。假设该键的哈希码为2349873。索引值为1。因此,此键将存储在索引1中。
get()方法用于通过其Key获取值。如果您不知道密钥,它将不会获取值。调用get(K Key)方法时,它将计算Key的哈希码。
假设我们必须获取密钥“ Aman”。将调用以下方法。
map.get(new Key("Aman"));
它生成的哈希码为2657860。现在,使用索引公式计算2657860的索引值。如我们上面计算的,索引值为4。 get()方法搜索索引值4。它将第一个元素Key与给定的Key相比较。如果两个键相等,则返回值,否则检查节点中的下一个元素是否存在。在我们的场景中,将其作为节点的第一个元素并返回值19。
让我们获取另一个键“ Sunny”。
键“ Sunny”的哈希码为63281940。如我们为put()方法计算的那样,计算出的索引值63281940为4。转到数组的索引4,然后将第一个元素的Key与给定的Key相比较。它还比较键。在我们的场景中,给定的Key是第二个元素,节点的下一个为null。它将第二个元素Key与指定的Key比较,并返回值29。如果下一个节点为null,则返回null。