- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
HashMap实现原理分析
HashMap实现原理分析
概述
HashMap是Java集合框架(Java Collection Framework, JCF)中一个基础类,它在1998年12月,加入到Java 2版本中。在此之后,Map接口本身除了在Java 5中引入了泛型以外,再没有发生过明显变化。然而HashMap的实现,则为了提升性能,不断地在改变。
1.hash表的复习
在正式学习HashMap源码之前,先复习一下hash表的实现。
1.1 什么是哈希表
哈希表(Hash table,也叫散列表),是根据关键字值(key,value)直接进行访问的数据结构。也就是说,它通过把关键字映射到表中一个位置来访问的纪录,以加快查找的速度。这个映射函数叫做散列函数,存放纪录的数组叫散列表。
1.2 哈希函数
1.2.1 直接定址法
取关键字或关键字的某个线性函数值为哈希地址。
H(key) = key 或 H(key) = a*key+b
1
1
1.2.2 除法散列法
取关键字被某个不大于散列表表长m的数p除后所得的余数为散列地址。对p的选择很重要,一般取素数或m,若p选的不好,容易产生同义词.
H(key) = key % p (p=m)
1
1
1.2.3 平方散列法
当无法确定关键字中哪几位分布较均匀时,可以先求出关键字的平方值,然后按需要取平方值的中间几位作为哈希地址。这是因为:平方后中间几位和关键字中每一位都相关,故不同关键字会以较高的概率产生不同的哈希地址。
H(key) = ((key * Key) X) Y
1
1
1.2.4 fibonacci散列法
和平方散列法类似,此种方法使用斐波那契数列的值作为乘数而不是自己。
对于16位整数而言,这个乘数是40503。
对于32位整数而言,这个乘数是2654435769。
对于64位整数而言,这个乘数是11400714819323198485。
H(key) = ((key * 2654435769) X) Y
1
1
1.3 冲突解决
1.3.1 开放寻址法
开放寻址法把所有的元素都存放在散列表中,也就是每个表项包含动态集合的一个元素(元素可以为NULL)。
1.在开放寻址法中,当要插入一个元素时,可以连续地检查散列表的个各项(连续检查是可以通过不同的算法获得偏移位),直到找到一个空槽来放置这个元素为止。
2.当查找一个元素时,要检查所有的表项,直到找到所需的元素,或者最终发现元素不在表中。
3.在开放寻址法中,对散列表元素的删除操作执行起来比较困难。当我们从槽i中删除关键字时,不能仅将此位置元素置空。因为这样做的话,会导致在无法判断此位置是否有元素。应该用个特殊的值表示该元素已经删除。
Hi=(H(key) + di) MOD m , [i=1,2,…,k(k=m-1)]
1
1
其中H(key)为散列函数,m为散列表长,di为增量序列,可有下列三种取法:
di=1,2,3,…,m-1,称线性探测再散列。
di=1^2,-1^2,2^2,-2^2,⑶^2,…,±(k)^2,(k=m/2)称二次探测再散列。
di=伪随机数序列,称伪随机探测再散列。
1.3.2 再散列法(再散列法)
产生碰撞时,再使用另一个散列函数计算地址,直到碰撞不再发生,这种方法不易产生“聚集”,但增加了计算时间(一个地址的产生可能会经过多个散列函数的计算)
Hi=Hn(key), [n=1,2 ...,]
1
1
有一个包含一组哈希函数 H1…Hn 的集合。当需要从哈希表中添加或获取元素时,首先使用哈希函数 H1。如果导致碰撞,则尝试使用 H2,以此类推,直到 Hn。所有的哈希函数都与 H1 十分相似,不同的是它们选用的乘法因子。
1.3.3 拉链法
产生碰撞时,把哈希到同一个槽中的所有元素都放到一个链表中。拉链法采用额外的数据结构来处理碰撞,其将哈希表中每个位置(slot)都映射到了一个链表。
1.3.4 公共溢出区
建立一个公共溢出区,当发生碰撞时,把碰撞元素放到缓冲区。
1.4 负载因子
负载因子(load factor),它用来衡量哈希表的 空/满 程度,一定程度上也可以体现查询的效率,
计算公式为:
负载因子 = 总键值对数 / 箱子个数
1
1
负载因子越大,意味着哈希表越满,越容易导致冲突,性能也就越低。因此,一般来说,当负载因子大于某个常数(可能是 1,或者 0.75 等)时,哈希表将自动扩容。
2红黑树的复习
2.HashMap
2.1 HashMap的定义
public class HashMapK,V extends AbstractM
您可能关注的文档
- GSM十户联防户长机使用说明书.doc
- GSM最差小区处理.ppt
- GSM网络优化资料.doc
- gsp条款讲解.ppt
- GSP检查员对采购部负责人现场提问参考(张俊、唐惠明).doc
- GSZ02施组.doc
- gtv网站运营计划6.doc
- Gucci的鉴别方法.docx
- GYDT-Ⅲ 接地引下线导通测试仪.doc
- GYFC-2G防雷元件测试仪.doc
- 2026秋季中国工商银行集约运营中心(佛山)校园招聘20人备考题库含答案详解(培优).docx
- 中国农业银行宁波市分行2026年度校园招聘214人备考题库附答案详解(夺分金卷).docx
- “梦工场”招商银行长沙分行2026寒假实习生招聘备考题库附答案详解(轻巧夺冠).docx
- 2026贵州省公共资源交易中心定向部分高校选调优秀毕业生专业技术职位考试备考题库完整参考答案详解.docx
- 中国建设银行建信金融资产投资有限公司2026年度校园招聘8人备考题库含答案详解(a卷).docx
- 中国农业银行宁夏回族自治区分行2026年度校园招聘146人备考题库及一套参考答案详解.docx
- 门头沟区青少年事务社工招聘1人备考题库附答案详解(模拟题).docx
- 中国建设银行运营数据中心2026年度校园招聘20人备考题库含答案详解ab卷.docx
- 中国建设银行建银工程咨询有限责任公司2026年度校园招聘9人备考题库及答案详解(有一套).docx
- 2026秋季中国工商银行重庆市分行校园招聘270人备考题库含答案详解(完整版).docx
最近下载
- 电力电子技术 第6版 第8章软开关技术.pdf VIP
- 电工电子技术课件 第八章 集成运算放大器及其应用.pptx VIP
- 2025至2030烟草行业发展趋势分析与未来投资战略咨询研究报告.docx
- 内蒙古自治区包头市青山区2023-2024学年九年级上学期1月期末物理试题.docx VIP
- 子宫病理取材.pptx VIP
- 包钢竞聘考试题目及答案.docx VIP
- 2023年高等教育法学类自考-00229证据法学考试历年真题荟萃版附带答案.docx VIP
- 海外合规.doc VIP
- 《Zbrush雕刻》课件——第一章_ZBrush软件介绍与就业市场.pptx VIP
- 国防军事课件——平型关大捷.ppt VIP
原创力文档


文档评论(0)