Java集合之HashMap

回顾

在上一篇 Java 集合之LinkedList 咱们讲了Collection的一个实现类LinkedList,是基于链表的实现,按原来打算是准备介绍HashSet,可是HashSet又与HashMap关系密切,因此此次仍是先介绍HashMap吧算法

首先须要注意的是HashMap不是Collection的实现 而是Map的实现,看下Map结构图编程

父接口Map是用来存储具备映射关系的数据:Key-value数组

Map中的key和value均可以是任何引用类型的数据bash

经常使用String类做为Map的“键”post

key和value之间存在单向一对一的关系,即经过指定的key总能找到惟一的 肯定的value性能

照例咱们看看Map接口中声明的方法spa

对应Collection3d

咱们看到Map中并无add addAll 方法 却有了put putAll方法 put系列方法就表明了新增和修改的方法code

咱们在看看HashMap实现类中有哪些方法cdn

HashMap除了实现了Map的通常方法还多了许多方法 可能是服务于具体实现的

HaspMap实现较为复杂,若一行行看源码,确定比较吃力 ,咱们先从思想上把握它

原理

1.HaspMap是什么?

HashMap是为了存储kay-value键值结构而服务的,咱们假想一个例子

考试的教室有100个座位, 那怎么让同窗们对号入座且尽可能分散呢(避免提早商量抄袭),
咱们先把座位进行编号。好比1到100 ,而后根据同窗的特征信息(好比学号)计算出一个值 恰好一一对应到咱们的编号1到100,
同窗们没法知道这个计算的方法,那么同窗们就会尽可能分散 从而没法提早商量了。
复制代码

2.HashMap的实现原理是什么呢?

put方法

在上面咱们知道座位的编号至关于key,而每个同窗就是一个value,同窗们入座完毕后,那么这个key-value就完成了, 经过代码咱们知道 座位是用数组来实现的

数组初始化时每一个单元都是null, 当第一个同窗A来了,咱们根据一个hash算法得出他的座位

index=Hash("A的学号")
复制代码

此时得出index=2 即应该在2号座位入座

把每一个同窗看做是一个Entry,就这样 同窗们相安无事的陆续就坐了。

慢着咱们仿佛发现了问题,这个问题就在与这个Hash方法 这个hash方法怎么实现呢?与他相关的参数只有同窗么?

固然不是,万一教室不是只有100个座位 而是有200个座位呢 那原来的计算方法就无论用了。 因此咱们知道了 这个hash方法应该是这样的

index=Hash(length,"A的学号")//length至关于座位数
复制代码

咱们看另外一个问题 当数据愈来愈多,万一根据hash算法得出的index是同样的怎么办?总不能把原来的entry移除吧

答案是这里每一个Entry又是一个链表(可参见Java集合之LinkedList),若遇到重复的则把新来的放到链表的头部

上图entry1本来在index=2的位置 当entry6来了时 把entry6放到了链表的头部 entry1放到链表的尾部 entry6的next指向entry1,这种叫作头插法,即每次新元素来时插入头部。

能够理解为了原来座位有人了,新来的我搬个凳子过来和你用一个桌子,哈哈

这样就完成了座位了分配且又根本的解决了座位重合的问题

get方法

就这样每一个同窗都陆续就坐完毕,可是老师点名找“A”时,怎么找呢,这就是查找方法get

最简单的是根据hash方法算一遍

index=Hash(length,"A的学号")//length至关于座位数
复制代码

获得index=2,可是这时根据学号算出的index=2的位置有两人,这怎么办?

也简单 挨个遍历一遍 核对下具体学号就完事了。

总结

hashMap是基于数组加链表的实现

这里的hash算法是整个实现的核心,篇幅缘由暂且不表,待后续文章放出

链表头部插入的优点在于:后加入的元素被查找的可能性更大,那么遍历链表时,查到的速度最快,性能损耗最少

还有个问题是 咱们看到数组长度 是随着愈来愈大的 那么动态扩容成了问题之重

喜欢本文的朋友们,欢迎长按下图关注订阅号个人编程笔记,收看更多精彩内容

相关文章
相关标签/搜索