初识HashMap(一)

        本文是个人对HashMap的理解,记录一下,方便以后学习,有不对的地方,请大家指正。

        HashMap是一个用key-value键值对存储数据的集合,每个键值对也叫做Entry,HashMap底层也是数组,这些Entry通过哈希算法,存储到底层数组中。

HashMap在初始化的时候,每个数组元素都是空值(null).

       

       我们通常使用HashMap的get和put方法,进行存值和取数


1、put方法的原理

调用 hashMap.put("id", 1) ,插入一个Key为“id"的元素。这时候我们需要利用一个哈希函数来确定Entry的插入位置(index):

index =  Hash(“id”)

假定计算出的index值为3,那么结果如下,将("id",1)即Entry1存放到数组3的位置。

由于HashMap的初始长度是有限的,当插入的键值对(Entry)越来越多时,通过Hash函数算出来的index会出现冲突的情况,如下所示:

当操作put("hello",1234)时,计算出的index= Hash("hello")值为3,即与之前的Entry1冲突,此时如何解决呢?

此时可以通过链表的方式来解决,即每个数组元素上存一个链表


HashMap数组的每一个元素不仅是一个Entry对象,也是链表的头节点。每一个Entry对象通过Next指针指向它的下一个Entry节点。当新来的Entry映射到冲突的数组位置时,只需要插入到对应的链表即可。采用的是“头插法”,原因是默认新插入的Entry对象被查找的可能性要高于原来已有的Entry。


2、get方法的原理

get是通过key值来找对应的value,首先是通过hash(key)获取到对应的哈希值index,以("id",1)为例,则

index=hash(id),假设index值为3,基于hash冲突,在index=3的位置上可能会有多个Entry,此时会从前往后按顺序查找(链表的头结点为前),如下图:



首先查找到Entry6,即("hello",1234),不是所要查找的Entry,继续往下查询至Entry1,找到对应的Entry1("id",1),其key值正好是我们所要找的id








猜你喜欢

转载自blog.csdn.net/jerry_player/article/details/78585278