问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Hashpmap的原理,HashMap怎样保证key的唯一性

发布网友 发布时间:2022-03-29 14:05

我来回答

1个回答

热心网友 时间:2022-03-29 15:34

在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

HashMap的功能是通过“键(key)”能够快速的找到“值”。下面我们分析下HashMap存数据的基本流程:

1、 当调用put(key,value)时,首先获取key的hashcode,int hash = key.hashCode();

2、 再把hash通过一下运算得到一个int h. 

hash ^= (hash >>> 20) ^ (hash >>> 12); 

int h = hash ^ (hash >>> 7) ^ (hash >>> 4); 

为什么要经过这样的运算呢?这就是HashMap的高明之处。先看个例子,一个十进制数32768(二进制1000 0000 0000 0000),经过上述公式运算之后的结果是35080(二进制1000 1001 0000 1000)。看出来了吗?或许这样还看不出什么,再举个数字61440(二进制1111 0000 0000 0000),运算结果是65263(二进制1111 1110 1110 1111),现在应该很明显了,它的目的是让“1”变的均匀一点,散列的本意就是要尽量均匀分布。那这样有什么意义呢?看第3步。

3、 得到h之后,把h与HashMap的承载量(HashMap的默认承载量length是16,可以自动变长。在构造HashMap的时候也可以指定一个长 度。这个承载量就是上图所描述的数组的长度。)进行逻辑与运算,即 h & (length-1),这样得到的结果就是一个比length小的正数,我们把这个值叫做index。其实这个index就是索引将要插入的值在数组中的 位置。第2步那个算法的意义就是希望能够得出均匀的index,这是HashTable的改进,HashTable中的算法只是把key的 hashcode与length相除取余,即hash % length,这样有可能会造成index分布不均匀。还有一点需要说明,HashMap的键可以为null,它的值是放在数组的第一个位置。

4、 我们用table[index]表示已经找到的元素需要存储的位置。先判断该位置上有没有元素(这个元素是HashMap内部定义的一个类Entity, 基本结构它包含三个类,key,value和指向下一个Entity的next),没有的话就创建一个Entity<K,V>对象,在 table[index]位置上插入,这样插入结束;如果有的话,通过链表的遍历方式去逐个遍历,看看有没有已经存在的key,有的话用新的value替 换老的value;如果没有,则在table[index]插入该Entity,把原来在table[index]位置上的Entity赋值给新的 Entity的next,这样插入结束。

Hashpmap的原理,HashMap怎样保证key的唯一性

HashMap的功能是通过“键(key)”能够快速的找到“值”。下面我们分析下HashMap存数据的基本流程:1、 当调用put(key,value)时,首先获取key的hashcode,int hash = key.hashCode();2、 再把hash通过一下运算得到一个int h.hash ^= (hash &gt;&gt;&gt; 20) ^ (hash &gt;&gt;&gt; 12);int h = hash ^ (ha...

如何传递Hashmap类型的对象

不知道LZ问题解决没,我想问下,如果一个继承hashmap的类( 如myhashmap),使用intent传递后,再取出来,老是报错 java.util.hashpmap 不能转换成继承的类(myhashmap),为什么会这样,我普通继承的类就没问题,偏偏继承hashpmap有这个问题

mapcontainskey原理 react通过key优化的原理 usbkey认证工作原理 vue循环中key的原理 containskey原理 keycloak原理 usbkey原理 keytop停车系统原理 游戏key原理
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
传统佳节有哪些 《大约是爱2》卫卿想当爸爸,却不愿意结婚的原因是什么? 广东美食在味道上有哪些特点? 粤菜在味道上有什么特点? 王者荣耀墨子装备最强出装 墨子怎么出装好[图]-手游攻略-游戏鸟手游网... 海尔笔记本电脑有什么好处 月经少吃什么 奥德赛和gl8如何选择? 5星的5怎么组词 dnf里面鬼泣和阿修罗哪个刷图厉害? 现在我玩的鬼泣,可是技能点不够用了... 收到短信附近陌聊是为什么? 如何证明费马大定理? 什么是低碳环保 太阳是怎么形成的 分数加减法的含义是什么 停车坐爱枫林晚,霜叶红于二月花。是什么意思? 你们对网恋有什么看法 谁知道除了OMEGLE外还有什么陌聊系统? 陌生聊天的收费是给对方吗? 陌约陌聊此软件限制截屏,我充了78块成了会员还是... 下载同城交友陌聊有风险吗 陌聊是不是坑钱的 陌聊是真的可约吗 了解陌聊是怎么回事 陌聊是什么意思,我问的不是在陌陌上聊天,我听别... hashtable和hashmap的区别及实现原理 我把老公微信头像换成我我们一家人的,为什么老公会... 老公的动漫微信头像一下换成情侣拥抱,这意味着什么? 本来微信头像是两夫妻的,今天老公就换成自己的头... 老公用黑猫做微信头像是什么意思? 匈奴如何大规模入侵欧洲各帝国? 匈奴人是在什么时候入侵欧洲东南部的? 匈奴攻打欧洲详情 匈奴和突厥是什么关系?匈奴是如何入侵欧洲的呢? 北匈奴为什么要侵略欧洲? 匈奴人入侵欧洲东南部是在什么时候,最后结果怎么... 匈奴入侵给欧洲带来了怎样的影响呢? 匈奴入侵欧洲占领了哪个国家地图 匈奴跑到欧洲后怎样了? 匈奴和突厥是什么关系 匈奴是如何入侵欧洲的 匈奴和突厥是什么关系?匈奴是如何入侵欧洲的? 匈奴人是怎样征服欧洲的? 为什么说匈奴西迁改变了欧洲的历史?为什么匈奴会... 北匈奴西侵欧洲的目的是什么? 匈奴人到欧洲后情况如何? 匈奴侵略过欧洲同样也侵略过中国,为什么中国统一... 入侵欧洲的匈人和中国古代的匈奴有关系吗? 匈奴人横行欧洲,难道欧洲军队就那么不堪一击么 匈奴人和欧洲的匈人 Java中HashMap和TreeMap的区别深入理解