加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营 > 正文

Java HashMap的事变道理

发布时间:2021-01-01 08:34:09 所属栏目:运营 来源:网络整理
导读:口试的时辰常常会碰见诸如:“java中的HashMap是怎么事变的”,“HashMap的get和put内部的事变道理”这样的题目。本文将用一个简朴的例子来表明下HashMap内部的事变道理。起首我们从一个例子开始,而不只仅是从理论上,这样,有助于更好地领略,然后,我们来

让我们看下put要领的实现:

,or null
  *         if there was no mapping for key. (A null return
  *         can also indicate that the map previously associated
  *         null with key.)
  */
  e = table[i]; e != modCount++;
addEntry(hash,key,<span class="hljs-keyword">value,i);
<span class="hljs-keyword">return <span class="hljs-literal">null;
}

此刻我们一步一步来看下上面的代码。

  1. 对key做null搜查。假如key是null,会被存储到table[0],由于null的hash值老是0。
  2. key的hashcode()要了解被挪用,然后计较hash值。hash值用来找到存储Entry工具的数组的索引。偶然辰hash函数也许写的很欠好,以是JDK的计划者添加了另一个叫做hash()的要领,它吸取适才计较的hash值作为参数。
  3. indexFor(hash,table.length)用来计较在table数组中存储Entry工具的准确的索引。
  4. 在我们的例子中已经看到,假如两个key有沟通的hash值(也叫斗嘴),他们会以链表的情势来存储。以是,这里我们就迭代链表。
  • 假如在适才计较出来的索引位置没有元素,直接把Entry工具放在谁人索引上。
  • 假如索引上有元素,然后会举办迭代,一向到Entry->next是null。当前的Entry工具酿成链表的下一个节点。
  • 假如我们再次放入同样的key会奈何呢?逻辑上,它应该替代老的value。究竟上,它确实是这么做的。在迭代的进程中,会挪用equals()要领来搜查key的相称性(key.equals(k)),假如这个要领返回true,它就会用当前Entry的value来替代之前的value。

Get:

此刻我们来看下get要领的实现:

  * A return value of {necessarily indicate that
  * the map contains no mapping for the key; it's also possible that the map
  * explicitly maps the key to { e = table[indexFor(hash,table.length)]; e != 

当你领略了hashmap的put的事变道理,领略get的事变道理就很是简朴了。当你转达一个key从hashmap总获取value的时辰:

  1. 对key举办null搜查。假如key是null,table[0]这个位置的元素将被返回。
  2. key的hashcode()要领被挪用,然后计较hash值。
  3. indexFor(hash,table.length)用来计较要获取的Entry工具在table数组中的准确的位置,行使适才计较的hash值。
  4. 在获取了table数组的索引之后,会迭代链表,挪用equals()要领搜查key的相称性,假如equals()要领返回true,get要领返回Entry工具的value,不然,返回null。

要紧记以下要害点:

  • HashMap有一个叫做Entry的内部类,它用来存储key-value对。
  • 上面的Entry工具是存储在一个叫做table的Entry数组中。
  • table的索引在逻辑上叫做“桶”(bucket),它存储了链表的第一个元素。
  • key的hashcode()要领用来找到Entry工具地址的桶。
  • 假如两个key有沟通的hash值,他们会被放在table数组的统一个桶内里。
  • key的equals()要领用来确保key的独一性。
  • value工具的equals()和hashcode()要领基础一点用也没有。

我的Java进修交换QQ群:589809992 我们一路学Java!

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读