HashMap的实现原理(补足六个汉字).docxVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
HashMap的实现原理 1. HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 2. HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 从上图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。 源码如下: HYPERLINK /cmdn/bbs/thread-16202-1-1.html \l viewSource \o view source view source HYPERLINK /cmdn/bbs/thread-16202-1-1.html \l printSource \o print print HYPERLINK /cmdn/bbs/thread-16202-1-1.html \l about \o ? ? 01 /** 02 * The table, resized as necessary. Length MUST Always be a power of two. 03 */ 04 transient Entry[] table; 05 06 static class EntryK,V implements Map.EntryK,V { 07 final K key; 08 V value; 09 EntryK,V next; 10 final int hash; 11 …… 12 } 可以看出,Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。 3. HashMap的存取实现: 1) 存储: HYPERLINK /cmdn/bbs/thread-16202-1-1.html \l viewSource \o view source view source HYPERLINK /cmdn/bbs/thread-16202-1-1.html \l printSource \o print print HYPERLINK /cmdn/bbs/thread-16202-1-1.html \l about \o ? ? 01 public V put(K key, V value) { 02 // HashMap允许存放null键和null值。 03 // 当key为null时,调用putForNullKey方法,将value放置在数组第一个位置。 04 if (key == null) 05 return putForNullKey(value); 06 // 根据key的keyCode重新计算hash值。 07 int hash = hash(key.hashCode()); 08 // 有哪些信誉好的足球投注网站指定hash值在对应table中的索引。 09 int i = indexFor(hash, table.length); 10 // 如果 i 索引处的 Entry 不为 null,通过循环不断遍历 e 元素的下一个元素。 11 for (EntryK,V e = table[i]; e != null; e = e.next) { 12 Object k; 13 if (e.hash == hash ((k = e.key) == key || key.equals(k))) { 14 V oldValue = e.value; 15 e.value = value; 16 e.recordAccess(this); 17 return oldValue; 18 } 19 } 20 // 如果i索引处的Entry为null,表明此处还没有Entry。 21 modCount++; 22 // 将key、value添加到i索引处。 23 addEntry(hash, key, value, i); 24 return null; 25 } 从上面的源代码中可以看出:当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链

文档评论(0)

文档终结者 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档